IPhone: изменение CGImageAlphaInfo в CGImage
У меня есть PNG-изображение, которое имеет неподдерживаемый формат пиксельного контекстного графического контекста. Всякий раз, когда я пытаюсь изменить размер изображения, CGBitmapContextCreate()
зажимается в неподдерживаемом формате
Я получаю следующую ошибку (ошибка отформатирована для удобства чтения):
CGBitmapContextCreate: unsupported parameter combination:
8 integer bits/component;
32 bits/pixel;
3-component colorspace;
kCGImageAlphaLast;
1344 bytes/row.
Список поддерживаемых форматов пикселей определенно не поддерживает эту комбинацию. Кажется, мне нужно перерисовать изображение и переместить информацию альфа-канала в kCGImageAlphaPremultipliedFirst или kCGImageAlphaPremultipliedLast.
Я понятия не имею, как это сделать.
В PNG файле нет ничего необычного, и он не поврежден. Он работает во всех других условиях просто отлично. Я случайно столкнулся с этой ошибкой, но, очевидно, мои пользователи могут иметь файлы с одинаковым форматированием, поэтому мне придется проверять импортированные изображения приложения и исправлять эту проблему.
Ответы
Ответ 1
Да, у меня были проблемы с 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;
}
Ответ 2
Здесь обновленная версия метода от Alfons отвечает на учетную карточку экрана, а также некоторые глупые ошибки с десятичными знаками в значениях с плавающей запятой размера изображения, как описано в несинхронизированном комментарии из исходного ответа.
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;
}