Photoshop画笔的混合算法实现(逆推)
生活随笔
收集整理的这篇文章主要介绍了
Photoshop画笔的混合算法实现(逆推)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
说明
使用OpenGL在一张rgba都为0.0的纹理上开glBlend(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)绘制线条后,再渲染到屏幕的时候发现有黑白。而PS的画笔工具在透明图层进行绘制的时候没有出现黑边。于是就有了研究PS颜色叠加混合的实现,下面只是推测…
PS的alpha叠加算法
在OpenGL表示为:glBlend(GL_ONE, GL_ONE_MINUS_SRC_COLOR)。
# sa: 要绘制上去的alpha # da: 已经在屏幕的alpha def psAlpha(sa, da):return (sa + (1.0 - sa) * da)PS的颜色叠加算法
如果要使用OpenGL实现就必须使用gl_LastFragData[0]这个数据,或者自己实现类似获取屏幕像素的rgba的功能。
# src: 要绘制上去的rgb # dst: 已经在屏幕上的rgb # sa: 要绘制上去的alpha # da: 已经在屏幕的alpha def psColor(src, dst, sa, da):alpha = ((1.0 - sa) * da) / psAlpha(sa, da)return (1.0 - alpha) * src + alpha * dst完整代码
import numpy as np# src: 要绘制上去的rgb # dst: 已经在屏幕上的rgb # sa: 要绘制上去的alpha # da: 已经在屏幕的alpha def psColor(src, dst, sa, da):alpha = (sa * da) / psAlpha(sa, da)return (1.0 - alpha) * src + alpha * dst# sa: 要绘制上去的alpha # da: 已经在屏幕的alpha def psAlpha(sa, da):return (sa + (1.0 - sa) * da)# dst没有任何颜色的情况, 绘制第一个颜色 srcColor0 = np.array([70.0, 209.0, 201.0]) / 255.0 dstColor0 = np.array([0.0, 0.0, 0.0]) / 255.0 srcAlpha0 = 0.5 dstAlpha0 = 0.0# 绘制第一笔后: dst有颜色 dstColor1 = psColor(srcColor0, dstColor0, srcAlpha0, dstAlpha0) dstAlpha1 = psAlpha(srcAlpha0, dstAlpha0)# 绘制第二个颜色 srcColor1 = np.array([226.0, 69.0, 69.0]) / 255.0 srcAlpha1 = 0.5dstColor2 = psColor(srcColor1, dstColor1, srcAlpha1, dstAlpha1) dstAlpha2 = psAlpha(srcAlpha1, dstAlpha1)# 绘制第三个颜色 srcColor2 = np.array([255.0, 0.0, 204.0]) / 255.0 srcAlpha2 = 0.5 dstColor3 = psColor(srcColor2, dstColor2, srcAlpha2, dstAlpha2) dstAlpha3 = psAlpha(srcAlpha2, dstAlpha2)print("---- 0 ----") print(dstColor0 * 255) print(dstAlpha0 * 255)print("---- 1 ----") print(dstColor1 * 255) print(dstAlpha1 * 255)print("---- 2 ----") print(dstColor2 * 255) print(dstAlpha2 * 255)print("---- 3 ----") print(dstColor3 * 255) print(dstAlpha3 * 255)总结
以上是生活随笔为你收集整理的Photoshop画笔的混合算法实现(逆推)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 杂项(记录工具)
- 下一篇: 张一鸣这一条微博,阿里P8的我,竟然想了