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

rqmkfv5c  于 2023-04-08  发布在  iOS
关注(0)|答案(3)|浏览(221)

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

unftdfkk

unftdfkk1#

你问到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的网站保留了它...)x1c 0d1x

5rgfhyps

5rgfhyps2#

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

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

}
pes8fvy9

pes8fvy93#

我已经更新了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
    }
  }
}

相关问题