发布
社区首页 >问答首页 >在javascript中将3D LUTs相互结合

在javascript中将3D LUTs相互结合
EN

Stack Overflow用户
提问于 2017-09-23 15:10:56
回答 1查看 723关注 0票数 0

我正在使用javascript中的3D颜色LUTs (颜色查找表),我想知道是否有一种将两个或多个3D LUTs组合在一个文件中的方法。让我解释一下:

我得到了.cube (3D颜色查找文件)。我解析它并将解析的颜色值存储到数组中,并将其应用于现有图像。在此之后,我将新的3D LUT应用到现有的(更改的)图像上,并再次应用新的LUT。所以,现在我有三个不同的三维LUTs应用于彼此的原始图像。

现在,我可以成功地在单独的文件中导出每个3D LUT并下载它,但是我不知道如何将它们组合成一个.cube文件。我相信我需要一些算法来“合并”不同的LUTs到一个文件?

这就是photoshop如何做到这一点的例子:

LUT1:

代码语言:javascript
代码运行次数:0
复制
0.024536 0.000183 0.000244
0.049103 0.000336 0.000458

LUT2:

代码语言:javascript
代码运行次数:0
复制
0.041260 0.021149 0.009125
0.067230 0.023804 0.009125

合并LUT (结果):

代码语言:javascript
代码运行次数:0
复制
0.035034 0.020660 0.009308
0.054810 0.022766 0.009430

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 23:07:06

经过一番研究,我找到了一个解决办法。本质上,我需要将第一个LUT的输出输入到第二个LUT的输入中。这需要在程序中有一个插值函数(而不仅仅是一个3D LUT着色器)。

流程如下所示:

  1. 创建所选大小的新标识LUT (默认LUT不作任何更改)
  2. 迭代该3D LUT的每个点,并通过第一个LUT的ColorFromColor,然后再通过第二个LUT的ColorFromColor,将每个点的标识颜色进行管道化。将最终值存储在新的LUT中。

函数如下所示:

代码语言:javascript
代码运行次数:0
复制
function mapColorsFast(out, image, clut, clutMix){
    let od = out.data,
        id = image.data,
        w = out.width,
        h = out.height,
        cd = clut.data,
        cl = Math.floor(Math.pow(clut.width, 1/3)+0.001),
        cs = cl*cl,
        cs1 = cs-1;

    var x0 = 1 - clutMix, x1 = clutMix;
    for(var y = 0; y < h; y++) {
        for(var x = 0; x < w; x++) {
            let i = (y*w+x)*4,
                r = id[i]/255*cs1,
                g = id[i+1]/255*cs1,
                b = id[i+2]/255*cs1,
                a = id[i+3]/255,
                ci = (dither(b)*cs*cs+dither(g)*cs+dither(r))*4;

            od[i] = id[i]*x0 + x1*cd[ci];
            od[i+1] = id[i+1]*x0 + x1*cd[ci+1];
            od[i+2] = id[i+2]*x0 + x1*cd[ci+2];
            od[i+3] = a*255;
        }
    }
}

函数只接受几个参数:输出缓冲区,将结果写入图像--一个包含imageData格式杂色LUT格式的图像的缓冲区,我们要应用于图像clutMix --影响效果的强度(0-1)。

在本例中,我们需要创建标识LUT,将其保存为图像,并将其作为图像参数传递给函数,然后将新的LUT应用到函数上。然后,我们再次将结果导入到相同的函数中,并将新的LUT应用到其中。我们对每个LUT都这样做,我们想要与其他LUTs混合。

我在https://github.com/jwagner/analog-film-emulator/blob/master/src/image-processing.js - Javascript电影仿真项目中找到了这个功能.

如果您正在使用canvas 2d图像处理,可以找到许多有趣的材料,还有一个工作示例,包括:https://29a.ch/film-emulator/

希望它能对未来的人有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46381040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档