365*_*uns 3 uiimage cgimage ios swift
我有一个函数,它接受一个 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
}
Run Code Online (Sandbox Code Playgroud)
您可以在前几行中看到我使用 print() 将每个 UIImage 和 CGImage 的大小打印到控制台。CGImage 总是 UIImage 大小的 3 倍......我怀疑它与@2x、@3x 等有关?
所以问题是为什么会发生这种情况,如何才能获得与我开始时大小相同的图像?
这是因为 UIImage 有一个scale属性。这在像素和点之间进行调解。因此,例如,从 180x180像素图像创建的 UIImage ,但 ascale为 3,会被自动视为大小为 60x60 points。它将报告其大小为 60x60,并且在 3x 分辨率屏幕上看起来也不错,其中 3 个像素对应于 1 个点。而且,正如您正确猜测的那样,@3x后缀或资产目录中的相应位置告诉系统在形成 UIImage 时将其scale设为 3。
但是 CGImage 没有这样的属性;它只是一个位图,即图像的实际像素。因此,从 180x180像素图像创建的 UIImage 形成的 CGImage也是 180x180点。
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |