UIImage裁剪透明像素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIImage裁剪透明像素相关的知识,希望对你有一定的参考价值。

在使用swift 4从UIImage裁剪透明像素后,我需要帮助来创建完美清晰的图像。

我想用删除透明颜色创建图像,所以为此我使用了下面的代码。但它会模糊图像,出现小的小方形矩形。

Using of below code

let imageCroppedBg = imgWithClearBackgroung!.cropAlpha()


//UIImage extension
extension UIImage {
    func cropAlpha() -> UIImage {

        let cgImage = self.cgImage!;

        let width = cgImage.width
        let height = cgImage.height

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bytesPerPixel:Int = 4
        let bytesPerRow = bytesPerPixel * width
        let bitsPerComponent = 8
        let bitmapInfo: UInt32 = CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrder32Big.rawValue

        guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo),
            let ptr = context.data?.assumingMemoryBound(to: UInt8.self) else {
                return self
        }

        context.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: width, height: height))

        var minX = width
        var minY = height
        var maxX: Int = 0
        var maxY: Int = 0

        for x in 1 ..< width {
            for y in 1 ..< height {

                let i = bytesPerRow * Int(y) + bytesPerPixel * Int(x)
                let a = CGFloat(ptr[i + 3]) / 255.0

                if(a>0) {
                    if (x < minX) { minX = x };
                    if (x > maxX) { maxX = x };
                    if (y < minY) { minY = y};
                    if (y > maxY) { maxY = y};
                }
            }
        }

        let rect = CGRect(x: CGFloat(minX),y: CGFloat(minY), width: CGFloat(maxX-minX), height: CGFloat(maxY-minY))
        let imageScale:CGFloat = self.scale
        let croppedImage =  self.cgImage!.cropping(to: rect)!
        let ret = UIImage(cgImage: croppedImage, scale: imageScale, orientation: self.imageOrientation)

        return ret;
    }
}

Output blurred & small square in small

Image with Alpha/transparent pixel

答案

在这一行中检查alpha分量是否> 0可能还不够:

if(a>0) {
    if (x < minX) { minX = x }
    if (x > maxX) { maxX = x }
    if (y < minY) { minY = y }
    if (y > maxY) { maxY = y }
}

也许你可以提高门槛:if(a > 0.5)甚至更高。 if (a == 1)将是限制,它将保证根本没有透明度。

如果你想让imageCroppedBg具有相同大小的imgWithClearBackgroung,那么将包含UIImageViewimgWithClearBackgroung的内容模式设置为.scaleAspectFit

let imageCroppedBg = imgWithClearBackgroung.cropAlpha()
imageView.image = imageCroppedBg
imageView.contentMode = .scaleAspectFit

有关内容模式的更多信息,请查看here

P.S:在Swift中,;在该行的末尾不是必需的。

以上是关于UIImage裁剪透明像素的主要内容,如果未能解决你的问题,请参考以下文章

C#裁剪图像中的透明部分

如何裁剪 UIImage?

裁剪像素缓冲区

裁剪掉透明像素但保留偏移量

检索透明UIImage的最后一个非透明像素位置

Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器