我想放大图像并用白色填充空间。
func resizeImageWithTransparentBackground(originalImage: UIImage, targetSize: CGSize) -> UIImage? {
let originalSize = originalImage.size
let widthRatio = originalSize.width / targetSize.width
let heightRatio = originalSize.height / targetSize.height
var newSize = CGSizeZero
//scale width or height
if widthRatio - heightRatio >= 0.01 {
newSize = CGSize(width: originalSize.width, height: originalSize.width)
} else {
newSize = CGSize(width: originalSize.height, height: originalSize.height)
}
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
UIColor.white.setFill()
UIRectFill(CGRect(origin: .zero, size: newSize))
// Center the original image
let originX = (newSize.width - originalSize.width) / 2
let originY = (newSize.height - originalSize.height) / 2
let rect = CGRect(x: originX, y: originY, width: originalSize.width, height: originalSize.height)
CGBitmapInfo(rawValue: 0)
originalImage.draw(in: rect)
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resizedImage
}
但是CGImage尺寸发生了变化:
另一个副作用是它会消耗大量内存。 为什么会发生这种情况以及如何解决这个问题?
谢谢
生成的图像尺寸放大 3x3。您在
UIGraphicsBeginImageContextWithOptions
中为比例提供了 0.0,这意味着它将使用比例因子或设备的主屏幕,在您的情况下似乎为 3。如果想保持与原图大小相同,请将scale参数设置为1.0。
此外,您的原始图像没有 alpha 通道,因此如果您想保持这种状态,您还应该为不透明布尔标志提供 YES。
与尺寸相关的主要问题是比例,第三个参数:
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
零表示使用设备屏幕的比例。显然您正在使用 3× 视网膜设备。
scale
作为第三个参数。