2010-08-25 55 views
1

我有一个从CGImage绘制图像的应用程序。CGImage的绘制部分

使用CGImageSourceCreateImageAtIndex加载CImage本身以从PNG文件创建图像。

这构成了一个精灵引擎的一部分 - 在单个PNG文件中有多个精灵图像,所以每个精灵都有一个CGRect,它定义了它在CGImage上的位置。

问题是,CGContextDraw只接受一个目标矩形 - 并拉伸源CGImage来填充它。

因此,要绘制每个精灵图像,我们需要使用CGImageCreateWithImageInRect()从原始源创建多个CGImages。

我一开始以为这是一个'便宜'的操作 - 它似乎并不需要每个CGImage都包含它自己的图像位拷贝 - 但是,剖析显示使用CGImageCreateWithImageInRect()昂贵的操作。

是否有一个更好的方法来绘制一个CGImage CGImage的一个子节到一个CGContext,所以我不需要经常CGImageCreateWithImageInRect()?


由于缺乏源矩形的,并且容易从一个CGImage一个矩形制作CGImage的我开始怀疑,也许CGImage实施的写入时复制语义,其中一个CGImage从CGImage制成将涉及与父节点相同的物理位的子节点。 分析似乎证明这个错误:/

回答

0
+0

如果我以避免“低效率”的方式来避免这种情况,那将是讽刺的事,事实证明这种方法的效率和速度更快。 – 2010-08-25 14:23:24

+0

CGImage对于某些东西比较好,尤其是读取和写入栅格图像(使用Image I/O)。但NSImage对于某些东西也更好,比如独立于分辨率的绘图(因为NSImage的大小以点为单位,以像素为单位)。 Mac OS X上没有单一的最佳图像类。 – 2010-08-25 14:42:42

0

我相信建议是使用剪辑区域。

2

我和你在同一条船上。 CGImageCreateWithImageInRect()为我的需求更好地工作,但之前我曾尝试将其转换为NSImage,并且在此之前我剪辑了我正在绘制的上下文,并翻译以便CGContextDrawImage()将正确的数据绘制到剪切区域中。

所有的解决方案,我试过:

  1. 剪辑和翻译是在CPU上过于收费。它太慢了。似乎增加位图数据量只会对性能产生重大影响,这表明此方法缺乏任何可伸缩性。

  2. 转换为NSImage相对有效,至少对于我们使用的数据而言。似乎没有任何重复的位图数据可以看到,这主要是我害怕从一个图像对象转到另一个图像对象的原因。

  3. 在一个点上,我转换为CIImage,因为这个类还允许绘制图像的子区域。这似乎比转换为NSImage慢,但确实让我有机会通过传递一些核心图像过滤器来绕过位图。

  4. 使用CGImageCreateWithImageInRect()是该地段中最快的;也许这是自上次使用以来已经优化的。documentation for this function表示生成的图像保留对原始图像的引用,这似乎与您对复制写入语义所做的假设一致。在我的基准测试中,似乎没有重复的数据,但也许我读的结果是错误的。我们采用这种方法,因为它不仅速度最快,而且看起来更像是一个更清晰的”方法,将整个过程保持在一个框架中。