CGBitmapContextCreate на iPhone/iPad

У меня есть метод, который должен проанализировать через набор больших изображений PNG попиксельно (PNGs составляют 600x600 пикселей каждый). Это, кажется, работает отлично на Средстве моделирования, но на устройстве (iPad), я получаю EXC_BAD_ACCESS в некоторой функции копирования внутренней памяти. Кажется, что размер является преступником, потому что, если я пробую его на меньших изображениях, все, кажется, работает. Вот связанная с памятью суть метода ниже.

+ (CGRect) getAlphaBoundsForUImage: (UIImage*) image 
{    
    CGImageRef imageRef = [image CGImage];

NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char *rawData = malloc(height * width * 4);
memset(rawData,0,height * width * 4);

NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);

/* non-memory related stuff */

free(rawData);

Когда я выполняю это на наборе изображений, он работает 12 раз и затем гадит, в то время как на средстве моделирования он не выполняет проблемы. Вы у парней есть какие-либо идеи?

6
задан toastie 12 April 2010 в 00:07
поделиться

3 ответа

Я использовал степень двойного размера выровненной строки в приложении, которое напрямую определяло размер строки, когда я создавал изображения программно. Но я бы также рекомендовал toastie попробовать CGImageGetBytesPerRow, прежде чем попробовать мое предложение.

0
ответ дан 17 December 2019 в 02:26
поделиться

Я получал подобный сбой на своем iPad (iPhoneOS 3.2, конечно), используя CGImageCreate(). Увидев вашу проблему, я получил подсказку. Я решил проблему, выровняв мой bytesPerRow по следующей наибольшей мощности 2.

size_t bytesPerRowPower2 = (size_t) round( pow( 2.0, trunc( log((double) bytesPerRow) / log(2.0) ) + 1.0 ) );

Сообщите нам, если выравнивание строк по мощности 2 также решит вашу проблему. Вам нужно будет выделить *rawData со скорректированным размером и передать bytesPerRowPower2 в CGBitmapContextCreate()... Высота, похоже, не нуждается в выравнивании.

0
ответ дан 17 December 2019 в 02:26
поделиться

Возможно, CGImageGetBytesPerRow (сила два звучит чрезмерно).

0
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: