2010-03-16 2 views
25

У меня есть изображение PNG, у которого есть неподдерживаемый формат пиксельного контекстного графического контекста. Всякий раз, когда я пытаюсь изменить размер изображения, CGBitmapContextCreate() дроссели на неподдерживаемый форматiPhone: Изменение CGImageAlphaInfo от CGImage

Я получаю следующее сообщение об ошибке (ошибка отформатирован для удобства чтения):

CGBitmapContextCreate: unsupported parameter combination: 
    8 integer bits/component; 
    32 bits/pixel; 
    3-component colorspace; 
    kCGImageAlphaLast; 
    1344 bytes/row. 

list of supported pixel formats определенно не поддерживает эту комбинацию. Кажется, мне нужно перерисовать изображение и переместить информацию альфа-канала в kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast.

Я понятия не имею, как это сделать.

В PNG-файле нет ничего необычного, и он не поврежден. Он работает во всех других условиях просто отлично. Я случайно столкнулся с этой ошибкой, но, очевидно, мои пользователи могли иметь аналогично отформатированные файлы, поэтому мне придется проверять импортированные изображения моего приложения и исправлять эту проблему.

ответ

56

Да, у меня были проблемы с 8-битным (индексированным) .PNG. Мне пришлось преобразовать его в более родное изображение для выполнения графических операций. Я по существу сделал что-то вроде этого:

- (UIImage *) normalize { 

    CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL, 
                 self.size.width, 
                 self.size.height, 
                 8, (4 * self.size.width), 
                 genericColorSpace, 
                 kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(genericColorSpace); 
    CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault); 
    CGRect destRect = CGRectMake(0, 0, self.size.width, self.size.height); 
    CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage); 
    CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt); 
    CGContextRelease(thumbBitmapCtxt);  
    UIImage *result = [UIImage imageWithCGImage:tmpThumbImage]; 
    CGImageRelease(tmpThumbImage); 

    return result;  
} 
+0

Выглядит хорошо, я попробую. Мне не нравится делать много обработки, потому что я боюсь, что я случайно погублю преданность. – TechZen

+0

Я, наконец, добрался до тестирования, и он отлично работает без заметной потери верности. – TechZen

+0

У меня проблема с вышеуказанным кодом, когда изображениеОриентация UIImage - это что-то вроде OrientationUp - это приводит к повороту изображения. Границы изображения остаются неизменными, но пиксели внутри изображения вращаются и растягиваются в соответствии с исходными границами. Это похоже на то, что описано в: http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree, но в этом случае это нормализовать функцию, которая, как представляется, вызывает проблему. Кто-нибудь еще это видит? Любое исправление для этого? – kurtzmarc

5

Вот обновленная версия методы от Альфонса ответа для учета масштаба экрана, а также некоторые глупые ошибки с десятичными числами с плавающей запятой от размера изображения, как описан в комментарии несинхронизированного-х из первоначального ответа.

SCREEN_SCALE - это макрос, который возвращает либо 1.0, если масштаб не определен, или как бы то ни было на шкале устройства ([UIScreen mainScreen] .scale).

- (UIImage *) normalize { 

    CGSize size = CGSizeMake(round(self.size.width*SCREEN_SCALE), round(self.size.height*SCREEN_SCALE)); 
    CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL, 
                 size.width, 
                 size.height, 
                 8, (4 * size.width), 
                 genericColorSpace, 
                 kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(genericColorSpace); 
    CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault); 
    CGRect destRect = CGRectMake(0, 0, size.width, size.height); 
    CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage); 
    CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt); 
    CGContextRelease(thumbBitmapCtxt);  
    UIImage *result = [UIImage imageWithCGImage:tmpThumbImage scale:SCREEN_SCALE orientation:UIImageOrientationUp]; 
    CGImageRelease(tmpThumbImage); 

    return result;  
} 
Смежные вопросы