为类似Photoshop的图像编辑器高效地组合/渲染多个图层

时间:2011-02-22 14:26:24

标签: graphics image-processing composition alphablending

我正在制作一个类似Photoshop的应用程序,它有大约1600个1200x1200层。每层可以具有不同的混合模式,例如正常混合,XOR混合,添加剂混合等,其中正常混合是最常见的。将所有层混合在一起在我的目标平台上大约需要0.3秒(这里是硬件加速选项)。

我的问题:当用户在图层上执行编辑操作时,如何有效地更新屏幕以显示所有图层展平/混合在一起?

例如,一个简单的操作可能是将一个图层转换为灰度图像。更复杂的操作是将画笔图像实时绘制到几个位置的其中一个图层上。具体来说,如果我尝试重新混合所有用户使用画笔,我的界面将无法响应。

我能想到的唯一优化是:

  1. 缓存展平的图像,并在发生更改时,仅更新已更改的展平图像的矩形。例如,对于小画笔图像,这将很快。
  2. 编辑图层时,缓存活动图层下方所有图层的展平图像。更新完整的展平图像时,我们只需要在此缓存图像上混合活动图层和上面的图层。
  3. 如果您正在编辑底层,

    2没有帮助,我无法看到如何预先展平活动层上方的所有图层。

1 个答案:

答案 0 :(得分:0)

在不了解目标平台的情况下,强烈建议采用某种硬件加速方式。 OpenGL 2.0+(或ES 2.0+)是最有可能提供帮助的东西 - 使用GLSL你会得到一种C风格的语言,其中有趣的一点就是提供一个片段程序,这就是GPU应该基于每个像素做的事情在输入纹理上,以产生输出颜色。您输出的位置是隐式的,但您可以输出到图像,然后使用该图像作为输入,这将直接与您的想法挂钩(2)。根据您所针对的确切硬件,Direct3d在HLSL中具有非常相似的构造可能是相关的,并且NVidia提供了一个更为专有的等价物,称为Cg,我认为现在可以编译为GLSL或HLSL。

否则:idea(1)是一个聪明的举动,特别是如果允许用户打开任意大小的图像。它导致花费的时间是画笔大小的函数,而不是图像。如果你以亚像素精度做事,你需要在思考上合理精确。

Idea(2)可能具有精确分支(特别是如果与硬件耦合)。为了保持完全相同的结果,显然您的中间缓冲区需要与中间变量具有相同的精度,在典型的面向消费者的绘图应用程序中,这通常意味着文件输入为8bpp / channel但中间存储需要至少为16bpp / channel如果你不想积累错误。这可能是硬件加速的最大潜在障碍,因为旧硬件往往会限制你到8bpp /通道中间缓冲区。现代硬件可以做到体面精度的浮点缓冲区。

可以从之后应用的层上的预计算中获得优势,但是每个像素的信息通常需要比仅仅颜色更复杂,并且最终可能不仅仅是存储原始缓冲区。可能聪明的事情是窥视孔优化。因此,如果您有两个相加的添加层,您可以使用单个添加层轻松替换它。两个乘法或两个XOR同上。因此,您将实现一个查看效果队列的循环,找到它知道如何变成更简单形式的任何模式并进行这些替换。并重复直到找不到替代品。出于优化目的,您甚至可能希望实现一些不直接提供给用户的复合操作。虽然,你需要考虑精确度。

在常见情况下,将普通混合应用于所有图层,您最终会对上面任意多个图层进行单个操作。