为啥我的 CGImage 是 UIImage 大小的 3 倍

Posted

技术标签:

【中文标题】为啥我的 CGImage 是 UIImage 大小的 3 倍【英文标题】:Why is my CGImage 3 x the size of the UIImage为什么我的 CGImage 是 UIImage 大小的 3 倍 【发布时间】:2016-03-11 16:41:18 【问题描述】:

我有一个函数,它接受一个 UIImage 和一个颜色,并使用它返回一个只具有该颜色的 UIImage。

作为函数的一部分,UIImage 被转换为 CGImage,但由于某种原因,CGImage 是 UIImage 大小的 3 倍,这意味着最终结果是它应该大小的 3 倍。

这里是函数

func coloredImageNamed(name: String, color: UIColor) -> UIImage 

    let startImage: UIImage = UIImage(named: name)!
    print("UIImage W: \(startImage.size.width) H\(startImage.size.height)")

    let maskImage: CGImage = startImage.CGImage!
    print("CGImage W: \(CGImageGetWidth(maskImage)) H\(CGImageGetHeight(maskImage))")

    // Make the image that the mask is applied to (Just a rectangle of the color want to use)
    let colorImageSize: CGSize = CGSizeMake(startImage.size.width, startImage.size.height)
    let colorFillImage: CGImage = getImageWithColor(color, size: colorImageSize).CGImage!

    // Make the mask image into a mask
    let mask: CGImage = CGImageMaskCreate(CGImageGetWidth(maskImage),
        CGImageGetHeight(maskImage),
        CGImageGetBitsPerComponent(maskImage),
        CGImageGetBitsPerPixel(maskImage),
        CGImageGetBytesPerRow(maskImage),
        CGImageGetDataProvider(maskImage), nil, false)!

        // Create the new image and convert back to UIImage, then return
        let masked: CGImage! = CGImageCreateWithMask(colorFillImage, mask);
        let returnImage: UIImage! = UIImage(CGImage: masked)
     return returnImage

您可以在前几行中看到我使用 print() 将 UIImage 和 CGI​​mage 的大小打印到控制台。 CGImage 始终是 UIImage 大小的 3 倍...我怀疑它与 @2x、@3x 等有关?

所以问题是为什么会发生这种情况,如何才能获得与我开始时相同大小的图像?

【问题讨论】:

【参考方案1】:

这是因为 UIImage 有一个scale 属性。这介于 像素 之间。因此,例如,从 180x180 pixel 图像创建的 UIImage,但 scale 为 3,会自动被视为大小为 60x60 points。它将报告其大小为 60x60,并且在 3 像素对应 1 点的 3 倍分辨率屏幕上看起来也不错。而且,正如您正确猜测的那样,@3x 后缀或资产目录中的相应位置会告诉系统在 UIImage 形成时为它赋予 3 的 scale

但是 CGImage 没有这样的属性;它只是一个位图,图像的实际像素。因此,由 180x180 pixel 图像创建的 UIImage 形成的 CGImage 也是 180x180 points

【讨论】:

有关此主题的更多信息,请参阅我的书:apeth.com/iosBook/ch15.html#_cgimage_drawing 该部分准确地讨论了绘制 CGImage 以避免出现错误大小的问题。

以上是关于为啥我的 CGImage 是 UIImage 大小的 3 倍的主要内容,如果未能解决你的问题,请参考以下文章

UIImage 大小(以像素为单位)

CGContextDrawImage 在传递 UIImage.CGImage 时将图像倒置

截取UIImage指定大小区域

将 UIImage 转换为 CGImage 以获取像素颜色

将 UIImage 转换为 CGImage 会导致图像旋转

在前向类对象“UIImage”中找不到属性“CGImage”