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

Posted

技术标签:

【中文标题】如何检查 UIImage 是不是具有透明度【英文标题】:How to check if UIImage has transparency如何检查 UIImage 是否具有透明度 【发布时间】:2020-12-18 20:11:20 【问题描述】:

我用这个函数来检测 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 截屏时。 您可以像sips -g all image.png 这样检查 png 以找出图像属性。我刚刚检查了一个 cmd-shift-4 屏幕截图,它实际上有一个 alpha 通道(尽管它没有被使用)。我想这就是你的代码测试的目的。 【参考方案1】:

您询问了 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,但不适用于 Mac OS 的屏幕截图。我不知道为什么。可能是因为 MacOS 创建的屏幕截图确实有 alpha 层但没有使用它,这使得代码返回 true【参考方案2】:

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

- (BOOL)hasAlpha : (UIImage*) img

    CGImageAlphaInfo alpha = CGImageGetAlphaInfo(img.CGImage);
    return (
            alpha == kCGImageAlphaFirst ||
            alpha == kCGImageAlphaLast ||
            alpha == kCGImageAlphaPremultipliedFirst ||
            alpha == kCGImageAlphaPremultipliedLast
            );


【讨论】:

基本相同,但在 Objective C 中。正如我所说,代码对我不起作用。 A 把我的桌面截图并作为参数发送到这个函数,它返回 true

以上是关于如何检查 UIImage 是不是具有透明度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用GD检查图像是不是具有透明度?

检测具有透明背景的 UIImage 的裁剪矩形

在我将它用作 Xcode 中的应用程序图标之前,如何检查图标是不是具有透明度

如何设置 UIImage 的不透明度/alpha?

如何在不透明的 UIImage 上用另一种颜色替换给定颜色 [重复]

寻找具有透明背景的旋转图像的边界框