我使用以下方法從文件系統中獲取解壓縮的uiimage。但是,當我打開顏色混合圖層時,即使UIImageView設置爲「不透明」,UIImageView也會顯示爲紅色。從UIImage中刪除alpha通道
文件系統上的圖像不具有alpha通道。我試過設置CGContextSetAlpha(bitmapContext,1),但仍然有混合層。
任何人都知道如何使用CGContextDrawImage時取出alpha通道?
- (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刪除Alpha通道並不能真正提升性能,因爲它們在創建UIImage時基本上爲您填充。儘管如此,它仍然是一個很好的優化:) – Jack
我剛剛發現使用kCGImageAlphaNoneSkipLast比使用kCGImageAlphaPremultipliedFirst消耗更多的內存。你有什麼想法是什麼原因造成的? – Jensen