目录
位运算
1.与运算&
2.或运算 |
3.异或运算^
2.图形库颜色位运算与透明贴图实现
相关操作码
透明贴图的实现
我们都知道电脑的系统处理方式都是以二进制去处理的,每一个数据的背后都是二进制数字0跟1表示,那么这一期我就来介绍怎么去利用二进制数字来处理图像,实现透明贴图。
位运算
二进制数的位运算的表示方法有------原码、反码、补码
符号位:正数的符号位为 0 ,负数的符号位为 1
正数的原码=反码=补码
负数的反码是原码除了符号位不变其他按位取反,补码就是反码+1
位运算规律:正数的位运算就是直接利用其原码就行了,而负数(符号位为1)的位运算要用补码才可以进行
结果取值:如果运算结果的符号位为1,那么就要取结果的补码才是最后的结果;如果符号位为0的话,那么就不需要多余的操作,直接就是结果
位运算理解方法:我们可以用数学的方法去理解位运算,令:1为真,0为假
1.与运算&
0&0=0
0&1=0
1&0=0
1&1=1
规律:一真一假结果为假,也就是0
两个都是假的,结果也是假,结果为0
两个都是真的,结果就是真,结果为1
示例:
#include<stdio.h>
int main()
{
printf("%d\n",12&10);
printf("%d\n",-7&5);
}
//输出结果是 第一个是8 第二个1
与运算& 过程如下:
12的二进制数原码是0000 1100
10的二进制数原码是0000 1010
&运算结果是 0000 1000
再转化为十进制得到结果为 8
-7的补码是1111 1001
5的原码是 0000 0101
结果 0000 0001
十进制结果是 1
2.或运算 |
0 | 1=1
1 | 0=1
0 | 0=0
1 | 1=1
规律: 一真一假得假
两个都真得真
两个 都假得假
#include<stdio.h>
int main()
{
printf("%d\n", 12 | 10);
printf("%d\n", -7 | 5);
}
//结果分别为 14 -3
或运算| 过程:
12原码 0000 1100
10原码 0000 1010
结果 0000 1110
化为十进制为 14
-7补码 1111 1001
5原码 0000 0101
结果 1111 1101
符号位为1,所以取补码 1000 0011
化为十进制结果为 -3
3.异或运算^
1^1=0
0^0=0
1^0=1
0^1=1
规律:相同为0,不同为1 (任何数与0进行异或运算结果还是那个数字)
#include<stdio.h>
int main()
{
printf("%d\n", 12 ^ 10);
printf("%d\n", -7 ^ 5);
}
//结果分别是6 -4
异或运算^ 过程:
12原码 0000 1100
10原码 0000 1010
结果 0000 0110
化为十进制为 6
-7补码 1111 1001
5原码 0000 0101
结果 1111 1100
符号位为1,所以取补码 1000 0100
化为十进制结果为 -4
异或运算应用:交换变量数值
#include<stdio.h>
int main()
{
int a = 10;
int b = 11;
a=a^b;
b=a^b;
a=a^b;
printf("%d %d\n", a, b);
}
这里位运算就先介绍这三个,其实还有非运算,左移右移等运算就不多介绍了
2.图形库颜色位运算与透明贴图实现
相关操作码
众所周知RGB是三原色,即红绿蓝,不同的RGB数值可以混合成不同的颜色,其中RGB的二进制位数是8位,因为RGB里面的每一个数值范围是0~255,即最大是2的8次方。实现图形颜色识别的也就是RGB的二进制数,所以我们可以去通过位运算来实现图形每一个像素点的颜色的改变,从而达到想要的效果。
以下是dwrop的相关操作码(实现颜色的位运算):
这里我们可以知道黑色的RGB值都是为0,而白色的RGB值全是255.
透明贴图的实现
在这里我会教教大家怎么去通过RGB的位运算来实现透明体贴。
首先我们要准备好两张图片
这两张一个是黑色背景以及要贴上去的彩色前景,另外一个是作为遮掩图,白色背景以及黑色要贴上去前景,其作用是把图片的背景消除掉。下面这张是原图,但在这里并不使用到。
这里我来讲讲为什么要搞一个遮掩图。上面讲到与运算中,1&1=1,1&0=0,遮掩图的背景是白色,其RGB的值都是255,那么255这个数字在二进制中表示为1111 1111,这里我们可以通过与运算去实现背景的融合,因为1111 1111与任何RGB值运算结果还是等于那个RGB的值,结果是不变的。但是我们要贴的前景图是黑色的RGB值为0,二进制是0000 0000,如果进行与运算的话,结果就是为0,所以此时贴上去的图片前景是黑色的,但是背景与底图的背景融合的。效果如下:
如箭头所示,其要贴上去的图片是黑色的,但是背景已经实现了融合。
现在就是轮到这张图片来发挥作用了
这里我们可以去通过或运算来实现把前景彩色图贴上去,在或运算中1 | 0=1,0 | 0=0,1 | 1=1.所以这个黑色背景图RGB二进制值为0000 0000,如果与其他颜色RGB值进行或运算得出的结果就是该颜色的RGB值,结果不变,前面我们知道通过第一次与运算后,我们要贴的图的前景是黑色的,所以这个彩色前景图与黑色前景图或运算结果还是彩色前景图。效果如下:
下面是完整的代码:
#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
int main()
{
initgraph(800, 600);
cleardevice();
fillcircle(20, 20, 50);
IMAGE k,kk,kkk;
loadimage(&kkk, "kun.jpg", 800,600);
loadimage(&k, "d:\\图片ol\\微信图片_20221130173507.jpg", 400, 400);
loadimage(&kk, "微信图片_20221130173507.jpg", 400, 400);
putimage(0, 0, &kkk);//贴出背景
putimage(100, 100, &k,SRCAND);//先进行与运算
putimage(100, 100, &kk, SRCPAINT);//再进行或运算
system("pause");//卡住窗口,防止窗口消失
}
大家要注意保护好自己哦,阳了真滴很难受