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

我有一个函数,它需要一个UIImage和一个颜色,并使用它来返回一个UIImage的颜色。

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

这是function

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等有什么关系?

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

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

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