如何检查 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 是不是具有透明度的主要内容,如果未能解决你的问题,请参考以下文章
在我将它用作 Xcode 中的应用程序图标之前,如何检查图标是不是具有透明度