以下是CGImageCreateWithImageInRect的文档。
它将CGRect对象作为参数。根据我的理解,CGRect位于 points
然而文件说:
"引用生成的矩形中的像素,处理 矩形中的第一个像素作为子图像的原点。"
这似乎不准确,并且当我需要调整我的UIImages大小时证明了这一点。我需要将图像尺寸乘以屏幕比例,否则我的图像尺寸错误
var imageRef:CGImageRef = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0, 0, image.size.width*UIScreen.mainScreen().scale, image.size.height*UIScreen.mainScreen().scale))
如果我没有按比例增加,那么图像就太小了。
我是对的,这是不好的文档(因为它不应该采用点数的CGRect,然后将其作为像素读取)或者我不理解这里的基本内容吗?
答案 0 :(得分: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(名为:)),CGImage属性的实际像素尺寸将取决于设备或模拟器的比例因子。如果同一资产有多种尺寸,UIImage将加载与系统比例因子匹配的资产。换句话说,在这种情况下,你不能指望具有一致尺寸的UIImage的CGImage,并且缩放代码可能会出错。
答案 1 :(得分:0)
根据我的理解,CGRect是分数
CGRect
是"一种包含矩形的位置和尺寸的结构。"它基于CGSize
。这被定义为"包含宽度和高度值的结构。"其中,width
仅定义为"宽度值。"
documentation of CGSize
(或CGRect
)中没有任何地方告诉您如何解释这些值。它永远不会说"这些是积分"或者"这些是像素"或者"这些是毫米。"这取决于来电者。 CGSize
的文档警告您,它可以用作向量和" size"可能是消极的。 CGRect
的文档警告您,起源可能位于不同的地方。 (CGRect
用于UIKit和Core Graphics,它们具有不同的坐标系。)
我认为这里的文档没有任何问题。 CGRect
并不承诺任何有关扩展的内容。
那就是说,你不应该过度阅读像"点"和"像素"一如既往的意义"与屏幕尺度相关,"特别是在旧文档中。单词" point"通常只是意味着"图像中的位置"在文档中(以及它在这里意味着什么)。这个特殊的功能可以追溯到OS X 10.4。在没有CGContext
,"屏幕范围"反正意义不大。此函数适用于原始图像位图数据。