写在前面:我是1024Person,一个编程道路上小白
一个崇尚知识免费,技术共享,代码开源的有点不一样的小白
今天我们来分享一下,如何利用easyx库贴出透明效果的技巧
原理剖析(位运算)
1
-
首先,众所周知,在计算机中任何信息都是以二进制的方式存储的,那么也就是说每一段视频,每一张张图片的背后是无数的0和1,这里具体来谈一谈图片背后的0和1
-
在进入正题之前要先介绍一下RGB三原色,为后面更好的理解
- 每一个像素点的RGB用一个int整形变量来表示,我们知道,每一个整形变量所占的字节数为4(三十二位,但是前八个位不存数据,用作占位符),所有平均下来RGB每一个原色都占八位,所以取值范围都是是0~255,也就是说用RGB(255,0,0)表示红色,因为在R(red)对应的位置(第一个位置)上是255,而G(green)和B(blue)对应的位置上(第二个和第三个)都是0,所以是红色,同理RGB(0,255,0),RGB(0,0,255)分别表示绿色和蓝色,RGB(255,255,255)表示白色,RGB(0,0,0)表示黑色,如果理解了白色和黑色这两个颜色,下面会更简单
每张图片背后对应的RGB
- 由于图片也是以数字的方式(0和1),存储在计算机中的,那么就说明
我们就可以图片做一些数字可以做的事,比如位运算 - 是的,我们就是对图片做位运算,下面的三句话可能有点无聊加枯燥,但是也是核心之处,请静下心来仔细琢磨,
- 任何数和0做或运算(|)还是它本身
- 任何数和0做与运算(&)都是0
- 任何数和1做或运算(|)都是它本身
请记住并理解这三句话
2
- 那么接下来问题就简单了,首先我们需要准备两张图片,一张黑底彩图,一张白底黑图,可能就是网上说的掩码图(俺也不是很清楚,尴尬)准备的图片如下
黑底彩图(以下简称图一)
白底黑图(以下简称图二) |
原图如下:
- 接下来就是重点了
- 首先,我们根据上面所说(任何数和0做与运算(&)都是0,任何数和1做与运算(&)都是它本身),那么如果我们用图二和背景图片做与运算的话会发生什么呢?
- 结果就是:背景图片中与黑色重叠的部分会全部变成黑色,和白色重叠的部分还是它本身如下所示
- PS:我们设置的背景为红色(setbkcolor(RED))
可以看到这样我们确实将深蓝色的背景去掉了,但是,卡通人物呢?这样显然不行,还没有达到目的- 那么接下来,
我们在同样的位置上贴出图一,和该位置的图片做或运算 - 结果如下
- 下面我们来讨论讨论,究竟是如何把卡通人物填到黑色区域中的
- 首先根据我们在上面提到过的(任何数和0做或运算都是它本身,同理0和任何数做或运算结果为任何数)
- 那么,贴入的图一中,黑底部分经过与运算之后就会变为背景色(因为背景色为RGB(255,0,0)和0做与运算之后,这一部分还是RGB(255,0,0),没有改变,在背景图的卡通人物处的黑色和贴入的图一的卡通人物重合,经过与运算之后,那么该处变为图一的卡通人物,最后就是我们看到的类似于透明背景的效果了
3、
最后我们来总结一下,
- 贴出白底黑图的图片(图二)和背景图片做与运算,
目的:将背景去掉
副作用:卡通人物也没有了 - 贴出黑底彩图的图片(图一)和目标图片做或运算
目的:弥补第一步的副作用,卡通人物填入
总结来说,第一步将背景去掉,第二部将人物填入
实现
图片的准备
-
打开PS软件
-
打开图片
-
制作掩码图
-
ctrl+c复制所选内容
-
新建一个工作区域(文件–>新建,或者快捷键ctrl+n)
(PS:这里要提一下的是,剪切版的大小会根据你复制的内容自动调节,所以我们不需要关心剪切板大小的问题,直接点创建就好了)
-
ctrl+v,将复制的卡通人物粘贴到剪切板中,黑底彩图就制作完成了,然后保存(文件–>导出—>快速导出为png,或者快捷键CTRL+s)
-
制作白底黑图(图像----->模式–>灰度,之后会弹出一个对话框点击拼合)
拼合
-
设置阈值(图像—>调整–>阈值)
PS:这里说明一下阈值调节的标准:调节到黑色和白色有明显的界限
-
当前图片还是黑底白图,我们要的是白底黑图,所以还要进行反向(图像---->调整---->反向)
反向之后: -
保存,此时我们的黑底白图就制作好了,(文件—>导出—>快速导出为png或者快捷键CTRL+s)
代码实现
#include<iostream>
using namespace std;
#include<easyx.h>
int main()
{
IMAGE _1, _2,_3; //_1,代表黑底彩图 ,_2代表白底黑图 ,_3代表原图
loadimage(&_1, L"图一.png");
loadimage(&_2, L"图二.png");
loadimage(&_3, L"原图.png",500,500);
initgraph(1000, 500);
setbkcolor(RED);
cleardevice();
/*---------------------------------------------------------------------------|
| 注意:经过我们的分析得到,需要先贴白底黑图(图二)再贴黑底彩图,
| 而且位置必须相同
| 宏: “ SRCAND ” 做与运算
| 宏: “SRCPAINT” 做或运算
|---------------------------------------------------------------------------*/
putimage(0, 0, &_2, SRCAND);
putimage(0, 0, &_1, SRCPAINT);
putimage(500, 0, &_3);
/*--------------------------------------------------------------------*/
system("pause");
closegraph();
return 0;
}
最后
我想分享一下写博客的技巧:
- 首先截图工具必不可少(我用的是qq截图)
- 学会设置字体的格式,大小和字形
- 有一个制作gif的工具
分享一个介绍写博客技巧的博客(这话咋越听越绕口……),
链接: https://blog.csdn.net/cungudafa/article/details/84658703.
这篇博客干货满满哦,绝对不容错过!!
写在后面:我是1024Person,一个编程道路上的小白,一个正在前进的小白!!!
一个崇尚知识免费,技术共享,代码开源的有点不一样的小白