Я использую следующий метод для получения распакованного uiimage из файловой системы. Однако UIImageView окрашен в красный цвет, когда я включаю цветной смешанный слой, даже если UIImageView установлен в Opaque.Удалить альфа-канал из UIImage
Изображения в файловой системе не имеют альфа-канала. Я попробовал установить CGContextSetAlpha (bitmapContext, 1), но все еще имеет смешанный слой.
Кто-нибудь знает, как удалить альфа-канал при использовании CGContextDrawImage?
- (UIImage *)decompressedImage
{
CGImageRef imageRef = self.CGImage;
CGRect rect = CGRectMake(0.f, 0.f, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef));
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
rect.size.width,
rect.size.height,
CGImageGetBitsPerComponent(imageRef),
CGImageGetBytesPerRow(imageRef),
CGImageGetColorSpace(imageRef),
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little
);
// kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little are the bit flags required
// so that the main thread doesn't have any conversions to do.
CGContextDrawImage(bitmapContext, rect, imageRef);
CGImageRef decompressedImageRef = CGBitmapContextCreateImage(bitmapContext);
UIImage* decompressedImage = [UIImage imageWithCGImage:decompressedImageRef
scale:[[UIScreen mainScreen] scale]
orientation:UIImageOrientationUp];
CGImageRelease(decompressedImageRef);
CGContextRelease(bitmapContext);
return decompressedImage;
}
Это работает. Хотя я не сильно улучшил производительность, рад видеть красные метки. Благодарю. – Jensen
@Jensen Удаление альфа-канала не дает вам повышения производительности, потому что они в основном заполняют его для вас при создании UIImage. Вы получаете импульс меньших сжатых изображений, хотя так что все еще хорошая оптимизация :) – Jack
Я только что обнаружил, что использование kCGImageAlphaNoneSkipLast потребляет гораздо больше памяти, чем при использовании kCGImageAlphaPremultipliedFirst. Есть ли у вас какие-либо идеи, что вызывает это? – Jensen