为什么透明背景调整大小后CGImage尺寸改变了?那么如何降低内存消耗呢?

问题描述 投票:0回答:2

我想放大图像并用白色填充空间。

    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尺寸发生了变化:

另一个副作用是它会消耗大量内存。 为什么会发生这种情况以及如何解决这个问题?

谢谢

ios uiimageview cgimage
2个回答
0
投票

生成的图像尺寸放大 3x3。您在

UIGraphicsBeginImageContextWithOptions
中为比例提供了 0.0,这意味着它将使用比例因子或设备的主屏幕,在您的情况下似乎为 3。如果想保持与原图大小相同,请将scale参数设置为1.0。

此外,您的原始图像没有 alpha 通道,因此如果您想保持这种状态,您还应该为不透明布尔标志提供 YES。

查看开发者文档: https://developer.apple.com/documentation/uikit/1623912-uigraphicsbeginimagecontextwitho?language=objc


0
投票

与尺寸相关的主要问题是比例,第三个参数:

UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

零表示使用设备屏幕的比例。显然您正在使用 3× 视网膜设备。

如果您要使用此旧版 API,请使用图像

scale
作为第三个参数。

© www.soinside.com 2019 - 2024. All rights reserved.