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

6

我使用这个函数来检测 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


请提供您的方法无法处理的图片。 - de.
当您按下 cmd + shift + 4 进行截屏时,可以从剪贴板中获取图像。 - Brew Master
你可以像这样检查png文件的属性 sips -g all image.png。我刚刚检查了一个cmd-shift-4截图,实际上它有一个alpha通道(尽管没有被使用)。我猜那就是你的代码测试的东西。 - de.
3个回答

3

您询问了关于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
谢谢!我尝试了一下,它可以处理大多数png文件,但不能处理来自Mac OS的屏幕截图。我不知道为什么。 也许是因为MacOS创建的屏幕截图具有alpha通道但未使用它,这使得代码返回true。 - Brew Master
你正在使用AND运算符,这在我看来是错误的! - zero3nna
不,这种情况下是正确的用法:“如果它不是没有alpha的TypeOne并且它不是没有alpha的TypeTwo并且它不是没有alpha的TypeThree,那么它就有alpha。” - Duncan C

1

你的解决方案看起来很好,而且没有问题,但是你也可以看看这个:

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

}

1
基本上是一样的,只不过是用Objective C编写的。 就像我说的那样,这段代码对我来说不起作用。我在桌面上截了一张屏幕截图,并将其作为参数发送到此函数中,它返回true。 - Brew Master

1

我已经更新了Menaim的答案,适用于Swift,并且它按预期工作。

extension UIImage {
  public var hasAlpha: Bool {
    guard let alphaInfo = self.cgImage?.alphaInfo else { return false }
    switch alphaInfo {
    case .none, .noneSkipLast, .noneSkipFirst:
      return false
    default:
      return true
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接