Я конвертирую некоторый код рисования изображений из Каира в Кварц, и я постепенно делаю успехи и изучаю Кварц, но у меня возникла проблема с форматом изображения.
В Каирской версии это работает так:
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
имеет какое-то отношение к проблеме, но насколько я понимаю, это расстояние в байтах от одного ряда пикселей до другого, которое не относится к контексту Кварца?