CGBitmapContextСоздать и чересстрочный?образ - PullRequest
0 голосов
/ 20 декабря 2011

Я конвертирую некоторый код рисования изображений из Каира в Кварц, и я постепенно делаю успехи и изучаю Кварц, но у меня возникла проблема с форматом изображения.

В Каирской версии это работает так:

unsigned short *d = (unsigned short*)imageSurface->get_data();
int stride = imageSurface->get_stride() >> 1;

int height = imageHeight;
int width = imageWidth;
do {

    d = *p++; // p = raw image data
    width --;

    if( width == 0 ) {
        height --;
        width = imageWidth;
        d += stride;
    }

} while( height );

Теперь это создает изображение, как и ожидалось на Cairo::ImageSurface. Я перевел это на то, как использовать Кварц, и это делает успехи, но я не уверен, где я ошибаюсь:

NSInteger pixelLen = (width * height) * 8;
unsigned char *d = (unsigned char*)malloc(pixelLen);
unsigned char *rawPixels = d;

int height = imageHeight;
int width = imageWidth;
do {

    d = *p++; // p = raw image data
    width --;

    if( width == 0 ) {
        height --;
        width = imageWidth;
    }

} while( height );

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rawPixels, imageWidth, imageHeight, 8, tileSize * sizeof(int), colorSpace, kCGBitmapByteOrderDefault);
CGImageRef image = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
UIImage *resultUIImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);

Теперь это, очевидно, движется в правильном направлении, так как создает нечто, похожее на желаемое изображение, но создает 4 копии изображения подряд, каждая с различными заполненными пикселями, поэтому я предполагаю, что это чересстрочное изображение (я не знаю много о форматах изображений) и что мне нужно как-то объединить их, чтобы создать законченное изображение, но я не знаю, как это сделать с помощью Quartz.

Я думаю, что stride имеет какое-то отношение к проблеме, но насколько я понимаю, это расстояние в байтах от одного ряда пикселей до другого, которое не относится к контексту Кварца?

1 Ответ

0 голосов
/ 20 декабря 2011

Звучит так, что шаг будет соответствовать rowBytes или bytesPerRow.Это значение важно, потому что оно не обязательно равно width * bytesPerPixel, потому что строки могут быть дополнены до оптимизированных смещений.

Не совсем очевидно, что делает код в Каире, и это выглядит не совсем корректно.В любом случае, без части шага ваш цикл не имеет смысла, потому что он делает точную копию байтов.

Цикл в коде Каира копирует строку байтов, а затем перепрыгивает через следующую строку данных.

...