我正在使用javascript中的3D颜色LUTs (颜色查找表),我想知道是否有一种将两个或多个3D LUTs组合在一个文件中的方法。让我解释一下:
我得到了.cube (3D颜色查找文件)。我解析它并将解析的颜色值存储到数组中,并将其应用于现有图像。在此之后,我将新的3D LUT应用到现有的(更改的)图像上,并再次应用新的LUT。所以,现在我有三个不同的三维LUTs应用于彼此的原始图像。
现在,我可以成功地在单独的文件中导出每个3D LUT并下载它,但是我不知道如何将它们组合成一个.cube文件。我相信我需要一些算法来“合并”不同的LUTs到一个文件?
这就是photoshop如何做到这一点的例子:
LUT1:
0.024536 0.000183 0.000244
0.049103 0.000336 0.000458
LUT2:
0.041260 0.021149 0.009125
0.067230 0.023804 0.009125
合并LUT (结果):
0.035034 0.020660 0.009308
0.054810 0.022766 0.009430
谢谢!
发布于 2017-10-17 23:07:06
经过一番研究,我找到了一个解决办法。本质上,我需要将第一个LUT的输出输入到第二个LUT的输入中。这需要在程序中有一个插值函数(而不仅仅是一个3D LUT着色器)。
流程如下所示:
函数如下所示:
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/
希望它能对未来的人有所帮助!
https://stackoverflow.com/questions/46381040
复制相似问题