为什么我的CGImage 3 x大小与UIImage相同

时间:2016-03-11 16:41:19

标签: ios swift uiimage cgimage

我有一个带有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等有关吗?

所以问题是为什么会发生这种情况以及如何获得与我开始时相同尺寸的Image?

1 个答案:

答案 0 :(得分:3)

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

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