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画笔的混合算法实现(逆推)相关推荐
- 【YBT高效进阶】1基础算法/1逆推算法/2奇怪汉诺塔
[YBT高效进阶]1基础算法/1逆推算法/2奇怪汉诺塔 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 汉诺塔问题,条件如下: 这里有 ...
- 递推算法5——逆推法之猴子摘桃问题
逆推法是根据结果推出已知条件,推算方法与顺推法类似,只是需要将结果作为初始条件向前推算.比较典型的例子是猴子摘桃和存取问题 猴子摘桃 [问题描述] 猴子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又 ...
- 递推算法6——逆推法之存取问题
该存多少钱 小明打算为自己的三年研究生生活准备了一笔学费,一次性的存入银行,保证每年年底取出1000元,到第3年学习结束时刚刚好取完.假设银行一年整存零取得月息为0.31%,请问需存入银行多少钱? [ ...
- 程序算法之逆推法(口算猴子摘桃问题正解、详解)
偶然间看到有篇猴子摘桃问题的博文,问题蛮有趣的,只是他的答案令人不敢恭维.....问题如下: 有一只猴子,摘了很多桃子,他每天吃掉一些,剩下的桃子比之前的全部的一半少一个.他吃了十天才吃完,请问他一共 ...
- 猴子吃桃的逆推c语言算法,经典算法题每日演练 猴子吃桃
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多 ...
- 全排列及相关扩展算法(四)——原始中介数通过逆推求原排列算法
1.中介数逆推原排列:上一章我们讲到了中介数,通过一个排列可以很方便地求数它的中介数,通过中介数也可以很方便地求出排位序号.但是通过中介数逆推原排列就不是那么容易了.因为我们每求一位数,都需要对比其前 ...
- 算法之地推算法(逆推法)
逆推法实例: 小龙,每个月可以取出1000元.若在第48月小龙大学毕业时连本带息要取1000元,年利率是0.0171,那么至少要存多少钱? 则先要求出第47个月时银行存款的钱数 第47个月月末存 ...
- 算法第二节:逆推法解决“银行存款问题
问题描述:母亲为儿子sun 4年的大学生活准备了一笔存款,方式是整取零存,规定sun 每个月月底取下一个月的生活费.假设银行年利息为1.71%,计算该母亲每个月至少要存入多少钱? 算法分析:可采用逆推 ...
- 独辟蹊径:逆推Krpano切图算法,实现在浏览器切多层级瓦片图
独辟蹊径:逆推Krpano切图算法,实现在浏览器切多层级瓦片图 前言 1.功能简介 2.回顾krpano切图 3.krpano切图最常用的方式 4.瓦片地图金字塔模型 ==正片开始== 5.前置知识介 ...
最新文章
- java11 是长期支持_这里有你不得不了解的Java 11版本特性说明
- [Flex]Flex SDK 4(Gumbo)更方便的自定义样式、自定义SparkSkin(三)
- 但凡网络工程师会这个技能,也不至于天天抱怨工资低
- netbeans项目缺少服务器,Netbeans,添加Glassfish服务器“不存在”
- Java-Map从入门到性能分析2【HashMap的底层原理、构造方法优化、常用方法】
- 五大板块(1)—— 数组的定义,赋值与应用
- lua元表(简单例子)
- windows下eclipse调试hadoop详解
- spring的部分注释
- Bailian4007 计算字符串距离【DP】
- UVa12545 - Bits Equalizer
- weblogic + apache 负载均衡与Session复制
- linux .deb后缀文件,tar.gz和bin,以及rpm,deb等linux后缀的文件的区别
- 华三s5000配置镜像接口_H3C系列交换机端口镜像的配置
- 抖音下载助手GUI版 主页视频批量下载
- 宝塔Linux面板 软件商店中安装不了任何php版本的解决方法
- 【牛尔】【小p】这些美容强男的超级秘籍!!!丝般肌肤毛孔看不见,清透小面颊,丝滑小脸蛋儿,你难道不想拥有吗————【收缩毛孔的最佳方法】(一夜之间6万浏览量,大师的感召力和信服力就是强啊!)
- 直播画面已被主播锁定!输入正确的密码后可解锁画面。斗鱼直播主播锁定画面解锁方法(网页版)
- 【Lua编程基础】Lua编程SciTe和SublimeI的配置和使用
- java中的集合详解