Тестовый шаблон CGImageCreate не работает (iOS) - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь создать тестовый шаблон UIImage для устройства iOS 5.1. Размер целевого UIImageView составляет 320x240, но я пытался создать 160x120 тестовый шаблон UIImage (будущие изображения не тестового шаблона будут такого размера). Я хотел, чтобы верхняя половина окна была синей, а нижняя - красной, но я получаю то, что выглядит как неинициализированная память, повреждающая нижнюю часть изображения. Код выглядит следующим образом:

int width = 160;
int height = 120;
unsigned int testData[width * height];
for(int k = 0; k < (width * height) / 2; k++)
    testData[k] = 0xFF0000FF;   // BGRA (Blue)
for(int k = (width * height) / 2; k < width * height; k++)
    testData[k] = 0x0000FFFF;   // BGRA (Red)

int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * width;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, &testData, (width * height * 4), NULL);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();      
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, 
                                    colorSpaceRef, bitmapInfo, provider, NULL, NO,renderingIntent);

UIImage *myTestImage = [UIImage imageWithCGImage:imageRef];

Это должно выглядеть как еще один пример переполнения стека. Во всяком случае, я обнаружил, что при уменьшении размера тестового шаблона «поврежденная» часть изображения увеличивается. Что также странно, так это то, что я вижу красные линии в «поврежденной» части, поэтому не похоже, что я просто испортил размеры компонентов. Что мне не хватает? Похоже что-то в провайдере, но я этого не вижу.

Спасибо!

Добавлены скриншоты. Вот как это выглядит с набором kCGImageAlphaNoneSkipFirst:

AlphaSkipFirst

А вот как это выглядит с kCGImageAlphaFirst:

enter image description here

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Ваши данные пикселей находятся в автоматической переменной, поэтому они хранятся в стеке:

unsigned int testData[width * height];

Вы должны возвращаться из функции, где эти данные объявлены. Это заставляет кадр стека функции выталкиваться и повторно использоваться другими функциями, которые перезаписывают данные.

Однако ваше изображение все еще ссылается на данные пикселей по тому же адресу в стеке. (CGDataProviderCreateWithData не копирует данные, а просто ссылается на них.)

Чтобы исправить: используйте malloc или CFMutableData или NSMutableData, чтобы выделить место для ваших данных пикселей в куче.

0 голосов
/ 26 марта 2012

Ваше изображение содержит альфу, которую вы затем указываете системе игнорировать, пропуская самые значимые биты (то есть часть «В» вашего изображения).Попробуйте вместо этого установить kCGImageAlphaPremultipliedLast.

РЕДАКТИРОВАТЬ:

Теперь, когда я помню порядка байтов, я понимаю, что программа, вероятно, читает ваши значения в обратном направлении, так чтона самом деле хотите это kCGImageAlphaPremultipliedFirst

...