为什么我的CGImage大小是UIImage的3倍?

5

我有一个函数,它接收一个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和CGImage的大小打印到控制台。CGImage始终是UIImage的3倍大小... 我怀疑这与@2x、@3x等有关吗?
所以问题是为什么会发生这种情况,我该怎么做才能得到一个与我开始时相同大小的图像?
1个回答

10
由于UIImage有一个“scale”属性,它在像素和点之间进行沟通。例如,从一个180x180像素的图像创建一个UIImage,但比例为3,它将自动被处理为大小为60x60点的图像。它将报告其大小为60x60,并且在3倍分辨率屏幕上看起来非常好,其中3个像素对应1个点。正如您所猜测的那样,“@3x”后缀或资产目录中相应的位置告诉系统在形成UIImage时给它一个比例为3。
但是CGImage没有这样的属性;它只是位图,实际的图像像素。因此,从一个创建了180x180像素图像的UIImage形成的CGImage也是180x180点。

关于这个主题的更多信息,请参阅我的书:http://www.apeth.com/iOSBook/ch15.html#_cgimage_drawing。该部分讨论了当您绘制CGImage时如何避免出现错误大小的问题。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接