easyx图形库-----贴图技巧之透明贴图与位运算(与运算、或运算、异或运算)

       

目录

位运算

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");//卡住窗口,防止窗口消失
}

大家要注意保护好自己哦,阳了真滴很难受

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值