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