如何检查 UIImage 是否具有透明度

问题描述

我使用这个函数来检测 UIImage 是否具有透明度:

extension UIImage {
  public func isTransparent() -> Bool {
    guard let alpha: CGImageAlphaInfo = self.cgImage?.alphaInfo else { return false }
    return alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast
  }
}

但它不起作用。我用没有透明度的 png 图像尝试过,但它仍然返回 true。

每个像素的循环不是一个好主意,因为我猜它太贵了。 知道如何检查 UIImage 是否具有透明度,如下图所示: image

解决方法

您的解决方案似乎很好,并且没有问题,但您也可以查看此解决方案:

- (BOOL)hasAlpha : (UIImage*) img
{
    CGImageAlphaInfo alpha = CGImageGetAlphaInfo(img.CGImage);
    return (
            alpha == kCGImageAlphaFirst ||
            alpha == kCGImageAlphaLast ||
            alpha == kCGImageAlphaPremultipliedFirst ||
            alpha == kCGImageAlphaPremultipliedLast
            );

}
,

您询问了 Swift。 Menaim 给出了一个有用的答案,但在 Objective-C 中。

这是一个 Swift 版本:

extension UIImage {
    var hasAlpha: Bool {
        guard let alphaInfo = self.cgImage?.alphaInfo else {return false}
        return alphaInfo != CGImageAlphaInfo.none &&
            alphaInfo != CGImageAlphaInfo.noneSkipFirst &&
            alphaInfo != CGImageAlphaInfo.noneSkipLast
    }
}

我刚刚在没有 Alpha 通道的 PNG 图像上测试了上述内容,并且成功了。

这是一张没有 alpha 通道的 PNG 图像(假设 SO 的网站保留了它...) PNG image with no alpha

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...