【发布时间】:2019-01-26 09:41:18
【问题描述】:
在使用 swift 4 从 UIImage 裁剪透明像素后,我需要帮助创建完美清晰的图像。
我想创建删除透明颜色的图像,所以我 已使用以下代码。但它会用小方块模糊图像 出现矩形。
使用下面的代码
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;
}
}
【问题讨论】:
-
我不太明白这个问题,你能发布一个具有透明像素的 UIImage 的示例吗?你从哪里得到那个图像?您是否以编程方式创建它?是的,我确实看到边缘有些模糊,我理解这个问题,但我不知道如何重现这个问题以便准确地说明发生了什么。
-
@MihaiErős,我也加了透明图,供大家参考。
-
我看到“裁剪”之前的图像在边框上有那些方块。
标签: ios swift uiimage core-graphics crop