为什么使用 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
的值不是全像素。
作为 x
、y
、width
、height
的值,其中计算的 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 是什么意思)因为裁剪矩形(通常)不应大于图像矩形。
我正在裁剪图像:
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
的值不是全像素。
作为 x
、y
、width
、height
的值,其中计算的 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 是什么意思)因为裁剪矩形(通常)不应大于图像矩形。