Jen*_*sen 5 alpha uiimageview uiimage cgcontext ios
我使用以下方法从文件系统获取解压缩的uiimage.但是,当我打开颜色混合图层时,即使UIImageView设置为不透明,UIImageView也会显示为红色.
文件系统上的图像没有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;
}
Run Code Online (Sandbox Code Playgroud)
结果相同,但代码更少,需要担心的事情也更少:
func removeAlpha(from inputImage: UIImage) -> UIImage {
let format = UIGraphicsImageRendererFormat.init()
format.opaque = true //Removes Alpha Channel
format.scale = inputImage.scale //Keeps original image scale.
let size = inputImage.size
return UIGraphicsImageRenderer(size: size, format: format).image { _ in
inputImage.draw(in: CGRect(origin: .zero, size: size))
}
}
Run Code Online (Sandbox Code Playgroud)
在上下文的选项中,尝试选项
kCGImageAlphaNoneSkipLast
Run Code Online (Sandbox Code Playgroud)
要么
kCGImageAlphaNoneSkipFirst
Run Code Online (Sandbox Code Playgroud)
取决于您使用的是RGBA还是ARGB
即
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
rect.size.width,
rect.size.height,
CGImageGetBitsPerComponent(imageRef),
CGImageGetBytesPerRow(imageRef),
CGImageGetColorSpace(imageRef),
kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Little
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5381 次 |
| 最近记录: |