为什么使用 UIGraphicsContext 裁剪图像时会出现白边?

Why is there a white edge when cropping an image with UIGraphicsContext?

我正在裁剪图像:

UIGraphicsBeginImageContext(croppingRect.size)
let context = UIGraphicsGetCurrentContext()

context?.clip(to: CGRect(x: 0, y: 0, width: rect.width, height: rect.height))        
image.draw(at: CGPoint(x: -rect.origin.x, y: -rect.origin.y))

let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

裁剪后的图片有时会在右侧和底部边框出现 1px 的白边。放大右下角可以看到各个像素,如下所示。显然边框不是纯白色,而是白色阴影,可能来自后期压缩。

这个白边伪影是从哪里来的?

问题是 croppingRect 的值不是全像素。

作为 xywidthheight 的值,其中计算的 CGFloat 数字结果有时会是小数(例如 1.3 而不是 1.0)。解决方案是四舍五入这些值:

let cropRect = CGRect(
   x: x.rounded(.towardZero), 
   y: y.rounded(.towardZero),
   width: width.rounded(.towardZero),
   height: height.rounded(.towardZero))

四舍五入必须是 .towardZero(请参阅 here 是什么意思)因为裁剪矩形(通常)不应大于图像矩形。