2012-01-12 89 views
1

我正在做的是将2张图片合并成单张图片。drawInRect性能太慢

这是代码。

UIGraphicsBeginImageContext(CGSizeMake(1024, 768)); 

[image1 drawInRect:CGRectMake(0, 0, 512, 768)]; 
[image2 drawInRect:CGRectMake(512, 0, 512, 768)]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

但是drawInRect似乎太慢了。

有没有更快的方式来合并图像?

+0

你为什么试图合并两个图像? “太慢”是什么意思?你正在推动很多像素。 – 2012-01-12 04:33:05

+0

合并图像的最快方式是避免在不需要时合并它们。例如,您可以合并一次,缓存结果并重新使用该图像,直到其中一个预合并图像发生更改。 – dasblinkenlight 2012-01-12 04:37:01

+0

@KevinBallard因为我需要它。 – Umgre 2012-01-12 04:43:31

回答

3

选项0 - 确保只在需要绘制时绘制,而且只绘制需要绘制的东西。


选项1

如果您知道目标大小(也许self.frame.size?),你可以创建两个源图像(扁平化)的目标大小避免插一个图像。这样可以:

  1. 减少需要
  2. (如果你希望它看起来良好的CPU)
  3. 看更好地降低你必须提请
  4. 避免插补图像数量的内存 - 复合可以使用高质量插值。

当然,这只有当复合材料的变化频率低于它必须绘制时才有意义。

选项2

即使你想两个图像,你知道它们的大小不会改变,只是他们调整到他们必须(当然,监视内存的使用情况,如果你正在扩大它们)绘制的大小。

选项3

如果这不是一个选项,你可以改变CGContext的状态,并减少插值质量。如果您习惯于类似的CALayer转换,您可能会对低质量或无插值满意。

+1

OP是否编辑该问题?这似乎正在回答一个不同的问题(插值是从哪里来的?)。我只是遇到了一个问题,发现iOS drawInRect的速度非常慢(逐个像素地绘制图像,将其保存到磁盘,将其作为新文件重新加载(从磁盘!)并显示它,调用drawInRect :.这是疯了) – Adam 2012-05-10 17:36:25

+0

@亚当不,编辑的问题。拉伸/调整大小时使用了许多颜色的插值。重点在于调整大小非常耗时,但有一些质量选项和方法可以避免并尽量减少调整大小的速度。 – justin 2012-05-10 19:50:01

1

你可以做的一件事不是实现-drawRect:完全不是,而是有两个CALayers与你的两个图像作为它们的内容,然后把一个放在另一个的前面。不知道这会更快,但我认为这很可能(因为CA可以在GPU上异步处理绘图)。