Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 19, 2009 10:54:20

qwer
От:
Зарегистрирован: 2009-03-30
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: странности с QImage.bits()

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

P.S. Функция выделения альфы вызывается из отдельного QThread.
Если все манипуляции делать в основном треде, или в отдельном треде, все проходит нормально.
Скорее всего что-то не то с SIP.voidptr, который возвращается из qimage.bits().

код:

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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:03:41)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version