1

这是关于CGImageCreateWithImageInRect的文档。

它接受一个 CGRect 对象作为参数。据我了解,CGRect 以点为单位

但是文档说:

“引用生成的矩形内的像素,将矩形内的第一个像素视为子图像的原点。”

这似乎不准确,并且在我需要调整 UIImage 大小时得到了证明。我需要将图像尺寸乘以屏幕比例,否则我的图像尺寸错误

var imageRef:CGImageRef = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0, 0, image.size.width*UIScreen.mainScreen().scale, image.size.height*UIScreen.mainScreen().scale))

如果我不按比例相乘,图像就太小了。

我是对的,这是一个糟糕的文档(因为它不应该采用以点为单位的 CGRect,然后将其读取为像素)还是我不理解这里的基本内容?

4

2 回答 2

0

据我了解,CGRect 以点为单位

CGRect是“包含矩形位置和尺寸的结构”。它基于CGSize. 这被定义为“包含宽度和高度值的结构”。其中,width仅定义为“宽度值”。

(或)的文档中CGSizeCGRect没有任何地方告诉您如何解释这些值。它从不说“这些是点”或“这些是像素”或“这些是毫米”。这取决于调用者。文档CGSize警告您它可能被用作向量并且“大小”可能是负数。用于警告您的文档CGRect可能在不同的地方。(CGRect用于 UIKit 和 Core Graphics,它们具有不同的坐标系。)

我认为这里的文档没有任何问题。CGRect不承诺任何有关缩放的内容。

也就是说,您不应该过度解读“点”和“像素”等词的使用,因为它们总是意味着“与屏幕比例有关”,尤其是在旧文档中。“点”一词在文档中通常仅表示“图像中的位置”(这就是它的意思)。这个特殊的功能可以追溯到 OS X 10.4。在没有 的情况下CGContext,“屏幕比例”无论如何都没有多大意义。此函数适用于原始图像位图数据。

于 2018-02-12T23:44:10.033 回答
0

我认为基于此测试的文档是正确的(像素是像素):

var filename = "InterfaceButtons_Scores@2x.png"
var path = NSBundle.mainBundle().pathForResource(filename,ofType:nil)
var dataProvider = CGDataProviderCreateWithFilename(path!)
var cgimg = CGImageCreateWithPNGDataProvider(dataProvider, nil, false, .RenderingIntentDefault)!

print("size of 100x100px file loaded into CGImage")
print(CGImageGetHeight(cgimg));
print(CGImageGetWidth(cgimg));

var croppedImg = CGImageCreateWithImageInRect(cgimg, CGRect(x: 0, y: 0, width: 100, height: 100))

print("size of CGImage created with 100x100 Rect from 100x100 image")
print(CGImageGetHeight(croppedImg));
print(CGImageGetWidth(croppedImg));


filename = "InterfaceButtons_Scores@1x.png"
path = NSBundle.mainBundle().pathForResource(filename,ofType:nil)
dataProvider = CGDataProviderCreateWithFilename(path!)
cgimg = CGImageCreateWithPNGDataProvider(dataProvider, nil, false, .RenderingIntentDefault)!

print("size of 51x51px file loaded into CGImage")
print(CGImageGetHeight(cgimg));
print(CGImageGetWidth(cgimg));

croppedImg = CGImageCreateWithImageInRect(cgimg, CGRect(x: 0, y: 0, width: 100, height: 100))

print("size of CGImage created with 100x100 Rect from 51x51 image")
print(CGImageGetHeight(croppedImg));
print(CGImageGetWidth(croppedImg));

输出:

size of 100x100px file loaded into CGImage
100
100
size of CGImage created with 100x100 Rect from 100x100 image
100
100
size of 51x51px file loaded into CGImage
51
51
size of CGImage created with 100x100 Rect from 51x51 image
51
51

在不确切知道您如何尝试调整它们的大小以及您看到的确切结果的情况下,我不确定要对您的 UIImage 调整大小说些什么。我确实知道,如果您从资产目录中的资产创建 UIImage(使用 UIImage(named:)),则 CGImage 属性的实际像素尺寸将取决于设备或模拟器的比例因子。如果同一资产有多个尺寸,UIImage 将加载与系统比例因子匹配的任何资产。换句话说,在这种情况下,您不能指望 UIImage 的 CGImage 具有一致的尺寸,并且缩放代码可能会出错。

于 2016-04-16T19:00:56.277 回答