Russian Qt Forum
Ноябрь 23, 2024, 18:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: PyQt4: странности с QImage.bits()  (Прочитано 3362 раз)
qwerky
Гость
« : Ноябрь 18, 2009, 23:54 »

В компилируемом С-модуле пытаюсь скопировать альфу QImage в 8-битный буфер.
Проблема в том что данные получаются со смещением в 29 байт назад (с мусором в этих байтах).
При получении через pixel() все нормально, только очень медленно.
P.S. Функция выделения альфы вызывается из отдельного QThread.

код:
Код:
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get image alpha mask to byte buffer.
//   input: QImage image.
//   output: str maskBuf.
static PyObject *gray_c32GetAlphaMask(PyObject *self, PyObject *args) {
    PyObject *image; // input ARGB32 QImage

    // parse function parameters
    if (!PyArg_ParseTuple(args, "O", &image)) return NULL;
    
    // get image width and height
    U32 w = PyInt_AsLong(PyObject_CallMethod(image, "width", NULL));
    U32 h = PyInt_AsLong(PyObject_CallMethod(image, "height", NULL));
    
    if (w*h > 0) {
        // pointer to first color pixel
        U32 *c32Buf = PyCObject_AsVoidPtr(PyObject_CallMethod(PyObject_CallMethod((PyObject *)image, "bits", NULL), "ascobject", NULL));
        U8 *maskBuf = PyMem_Malloc(w * h); // allocate output buffer

        for (U32 yCnt=0; yCnt<h; yCnt++) { // y loop
            for (U32 xCnt=0; xCnt<w; xCnt++) { // x loop
                *maskBuf = *c32Buf >> 24; // get pixel alpha value
                c32Buf++;
                maskBuf++;
            }
        }
        return Py_BuildValue("s#", maskBuf, w*h);
    }
    return Py_BuildValue("O", Py_None);
}
« Последнее редактирование: Ноябрь 19, 2009, 11:46 от qwerky » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 20.