从UIImage中删除alpha通道

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)

Jus*_*zer 8

结果相同,但代码更少,需要担心的事情也更少:

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)


Jac*_*ack 5

在上下文的选项中,尝试选项

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)