当前位置: 首页 > 知识库问答 >
问题:

HTML5混合模式-油漆程序中的图层

漆雕令秋
2023-03-14

我正在创建html5绘画应用程序,目前正在处理混合层。我想知道在这样的程序中,哪种方法是最好的(最快的和类似gimp/photoshop的)。我的层(画布)是堆叠的。

  1. 通过CSS3属性更改混合模式(可能非常快-直接在显卡上混合)
  2. 具有隐藏的画布(图层)和一个画布来向用户显示平坦的图像。所以我们画在这些隐藏的画布上,有一些机制将每个隐藏的画布绘制到用户可见的画布上(可能较慢,但每个context.draw图像(...)在显卡上优化和计算)
  3. 隐藏的画布(层)是真正的虚拟。根本没有隐藏的画布元素。相反,记忆中有一些模仿画布的结构。这些结构只是保存用户在此虚拟层上执行的动作。然后,当需要重新绘制时,通过从每个虚拟层中获取每个操作并绘制它(真正的油漆)来重建用户画布。操作必须正确排序是这样的虚拟层结构(这可能很慢,但可能比第二种方法更快(我们不浪费时间在层上绘制任何东西,只是存储选项我们将如何在真实层上绘制)?)
  4. 通过WebGL混合(可能很快)
  5. 手动计算每个像素并向用户显示分数(超慢?)

我使用第二种方法,但我不确定它是否是最好的(尤其是对于更多层)。我想知道你是否知道其他的方法,也许你会建议什么更好的方法来实现混合操作,使它像Gimp/Adobe Photoshop一样工作

共有1个答案

澹台玉石
2023-03-14

我实现这一点的方法是有多个画布,每个画布存储自己的混合模式。但它只是虚拟画布(用户无法绘制)。然后每秒有33次计时器(由RequestAnimationFrame制作),它抓取所有这些画布,展平它们并将其绘制到视口。对于每个层,我在视口画布上执行混合模式更改。自drawImage(…)以来,它工作得非常完美在GPU上计算,速度非常快。

我认为代码是相当容易理解和应用在自己的解决方案:

   Process(lm: dl.LayerManager) {
        var canvasViewPort = lm.GetWorkspaceViewPort();
        var virtualLayers = lm.GetAllNonTemporary();

        canvasViewPort.Save();
        canvasViewPort.Clear();
        canvasViewPort.SetBlendMode(virtualLayers[0].GetBlendMode());
        canvasViewPort.ApplyBlendMode();
        canvasViewPort.DrawImage(virtualLayers[0], 0, 0, canvasViewPort.Width(), canvasViewPort.Height(), 0, 0, canvasViewPort.Width(), canvasViewPort.Height());
        for (var i = 1; i < virtualLayers.length; ++i) {
            var layer = virtualLayers[i];
            var shift = other.GetShift();
            canvasViewPort.SetBlendMode(virtualLayers[i].GetBlendMode());
            canvasViewPort.ApplyBlendMode();
            canvasViewPort.DrawImage(layer, 0, 0, layer.Width(), layer.Height(), shift.x, shift.y, layer.Width(), layer.Height());
        }
        canvasViewPort.Restore();
    }

不要害怕这个代码。它保持底层画布,纯CanvasRenderingContext2D。

我将执行这样的优化:在任何虚拟画布上发生更改之前,我不会重新绘制画布视口。

我将执行的下一个优化:获取选定的层,缓存当前层之前和之后的所有内容。

所以它看起来像:

CurrentLayer:3(可能受某些工具的影响)

[1]:L1
[2]:L2
[3]:L3
[4]:L4
[5]:L5
[6]:L6

使用适当的混合模式[1,2]绘制到临时tmp1,并将[4,5,6]绘制到tmp2。当第三层发生变化时,我只需要重新绘制tmp1[3]tmp2。所以它只是2次迭代。超快。

 类似资料:
  • 问题内容: 对不起,我进行了大量搜索,以查找这3个功能(绘画,重绘,paintComponent)之间如何相互作用,但我不知道。您能准确解释一下它们何时被调用(因为有时java会在没有我问他的情况下调用它),它们到底在做什么,它们之间有什么区别。谢谢 问题答案: 我不确定“ paint”,但是我可以解释repaint()和paintComponent()之间的关系。 根据我在Java方面的有限经验

  • 本章介绍Canvas组件,用它来生成简单的二维(2D)图形,目标是创建一个PaintPot(油漆桶)应用,让用户在手机屏幕上绘制图画,并让用户用手机给自己拍照,然后在自己的照片上绘图。回顾历史,早在20世纪70年代,PaintPot是最早运行在个人电脑上的应用之一,目的是为了证明个人电脑的潜力。那时候,开发这样一款简单的绘图应用是一项极其复杂的工作,而且绘图效果也略显粗糙。但现在,使用App In

  • 选项栏中指定的混合模式控制图像中的像素如何受绘画或编辑工具的影响。在显示混合模式的效果时,请依据以下几种颜色: 基色是原始图像颜色。 混合色是通过绘画或编辑工具应用的颜色。 结果色是混合后得到的颜色。 混合模式说明 从选项栏的“模式”弹出式菜单中进行选取。 注意: 在“混合模式”弹出菜单中,滚动查看各个选项,以了解它们在图像上的外观效果。Photoshop 会在画布上显示混合模式的实时预览效果。

  • 我正在尝试复制混合模式。目前我已经重新创建了一个屏幕混合模式,但它似乎不能很好地工作与透明图像。 我有两种纹理 图1(前景) 图片2(背景) 我得到的结果是 计算机着色器代码 我如何将图像与不同的阿尔法正确地混合在一起?

  • 使用图层混合模式 图层的混合模式控制每个图层如何与它下面的图层混合或交互。After Effects 中的图层的混合模式(以前称为图层模式,有时称为传递模式)与 Adobe Photoshop 中的混合模式相同。 大多数混合模式仅修改源图层的颜色值,而非 Alpha 通道。“Alpha 添加”混合模式影响源图层的 Alpha 通道,而轮廓和模板混合模式影响它们下面的图层的 Alpha 通道。 您无

  • 图层的混合模式确定了其像素如何与图像中的下层像素进行混合。使用混合模式可以创建各种特殊效果。 指定选定图层的整体和填充的不透明度 图层的整体不透明度用于确定它遮蔽或显示其下方图层的程度。不透明度为 1% 的图层看起来几乎是透明的,而不透明度为 100% 的图层则显得完全不透明。 除了设置整体不透明度(影响应用于图层的任何图层样式和混合模式)以外,还可以指定填充不透明度。填充不透明度仅影响图层中的像