关于 @webtoon/psd 解析PSD文件的图层混合模式信息

255 阅读3分钟

PS图层混合模式

PS中的混合模式,在前端解析PSD文件信息获取图层信息之后,需要获取相应模式的key值再做相应处理

9274e4de0bdbb7d3bce249d0f358077.png

文本图层

在使用 @webtoon/psd解析PSD文件之后,会得到基本的一些图层信息.在遍历了所有图层之后,经过解析后的数据,基本分两大类.LayerGroup.就是PS中图层和分组. 实际上,在我们需要处理Layer 的时候,可以简单的经过filter 把文字的图层纶单独标记出来.方便之后来单独处理.

image.png

image.png

比如说,上面这两个图层信息.简单直观的就能发现其中text属性有区别.所以,判断一下text有值的,就可以把他的type 改一下.这样,我们就可以得到

image.png

一目了然.方便之后针对文字图层进行单独处理,获取 fontSize,fontFamily,color 等等我们需要的属性出来.

image.png

其中,FillColor.Values: [1, 0.69019,0.16864, 0.12549] 就是文本的填充颜色色值.这个数组值,其实对应的就是前端rgba(0,0,0,0), 只不过需要调整一下顺序

image.png

Tracking 是文本间距,如果你是使用Fabricjs的话,对应文本的属性就是charSpacing

new fabric.IText("少林功夫好嘢 真好嘢", {
    charSpacing: 100
});

FontFamily 是在

image.png

文本基本就这些了,至于PS中更复杂的内发光,渐变之类文字效果.我也还没研究明白呢.哪位大佬知道的话,可以告知一下.多谢!

带混合模式的图层

带有混合模式的 Layer.在解析出来的Layer信息中我们可以看到有一个blendMode.接下来,我们的攻克目标就是他了.

image.png

在翻阅了大量资料之后,终于在 Adobe Photoshop File Formats Specification 中找到了.这里面是PS的一些信息规范.其中就有 混合模式 的 key 值

image.png

我简单的做了一个总结

// 常用PS 效果
// 'norm' = normal,
// 'mul ' = multiply,     正片叠底(Multiply)
// 'scrn' = screen,       滤色(Screen)
// 'over' = overlay,      叠加(Overlay)
// 'sLit' = soft light,   柔光(Soft Light)
// 'hLit' = hard light,   硬光(Hard Light)
// 'div ' = color dodge,  颜色减淡(Color Dodge)
// 'idiv' = color burn,   颜色加深(Color Burn)
// 'diff' = difference,   差值(Difference)
// 'smud' = exclusion,    排除(Exclusion)
// 'diss' = dissolve,     溶解(Dissolve)
// 'dark' = darken,       变暗(Darken)
// 'lbrn' = linear burn,  线性加深(Linear Burn)
// 'dkCl' = darker color, 深色(Darker Color)
// 'lite' = lighten,      变亮(Lighten)
// 'lddg' = linear dodge, 线性减淡(Linear Dodge)
// 'lgCl' = lighter color 亮色(Lighter Color)
// 'vLit' = vivid light,  亮光(Vivid Light)
// 'lLit' = linear light, 线性光(Linear Light)
// 'pLit' = pin light,    点光(Pin Light)
// 'hMix' = hard mix,     实色混合
// 'fsub' = subtract,     减去(Subtract)
// 'fdiv' = divide        划分(Divide)
// 'hue ' = hue,          色相(Hue)
// 'sat ' = saturation,   饱和度(Saturation)
// 'colr' = color,        颜色(Color)
// 'lum ' = luminosity,   亮度(Luminosity)

image.png

例如这个图层,说明它的混合模式就是 柔光.至于图层的填充值则是在additionalLayerProperties中.当然直接拿到iOpa.fillOpacity 还需要 (iOpa.fillOpacity / 255).toFixed(2) * 100,这样就可以得到填充值的百分比值了.

image.png

然后打开PS,在PS中看一下处理的值对不对.

image.png

image.png

总结

目前为止,一切都还顺利.如果以后还有遇到什么问题,再来记录吧.溜了溜了~