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

2023-11-09

       

目录

位运算

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 15个高清壁纸网站推荐

    15个高清壁纸网站推荐 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 极简壁纸 推荐 WallpaperCave CGWALLPAPERS 游戏壁纸 H128壁纸 Magdeleine Up
  • DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

    在开场白之前的说明 这是 DirectX 9 0c游戏开发手记 的第一部分 叫做 龙书 第二版学习笔记 讲的是我做 龙书 第二版 原名Introduction to 3D GameProgramming with DirectX 9 0c
  • 浅析单向tvs管和双向tvs管的对比,谁能更胜一筹

    瞬态抑制二极管 TransientVoltageSuppressor 简称TVS管 是一种二极管形式的高效能保护器件 当TVS管的两极受到反向瞬态高能量冲击时 它能以10的负12次方秒量级的速度 将其两极间的高阻抗变为低阻抗 吸收高达数千瓦
  • C高级笔记总结

    GCC 1 gcc 组件 1 分析器 分析语法结构 将C语言编译汇编语言 s 2 汇编器 将汇编代码编译成二进制文件 3 链接器 链接目标文件以及库文件 生成可执行代码 4 标准C库 提供核心的C库函数 scanf printf 2 gcc
  • mysql服务无法启动解决办法

    第一步先查看是不是端口号被占用 netstat aon findstr 3306 33060是mysql8 0 版本的扩展端口 果然被占用 强制终止进程 强制终止进程 11536 taskkill F pid 11536
  • Eastmount博客导读:专栏系统分类和博客归纳总结

    为了更好地帮助博友学习作者的博客 方便作者自己归纳总结专栏 本文详细介绍了作者八年来 在CSDN写的各种专栏 各种系列文章 八年来 作者经历了从本科到硕士 到贵州教书成家 再到现在的博士 八年来 作者学得很杂很宽 绝大多数专栏都是从零学起
  • Broken pipe产生原因分析

    一 Broken pipe产生原因分析 1 当访问某个服务突然服务器挂了 就会产生Broken pipe 2 客户端读取超时关闭了连接 这时服务器往客户端再写数据就发生了broken pipe异常 二 方案 1 问题一分析服务器为什么挂了
  • 可充电电池安规认证标准、GB 9706.1-2020对医用电气设备中电池的要求

    目录 可充电电池 安规认证标准 IEC 62133 标准主要包含以下项目的测试及验证 在这些测试及验证项目中 大部分均是常见的常规测试项目 但仍有部分项目值得留意及关注 UN38 3运输认证 UN38 3测试项目 GB 9706 1 202
  • mybatis 动态表名insert 传入表名、字段名、数据

    mybatis 动态insert 传入表名 字段名 数据 主要是实现不同的表名进行插入然后进行操作 可以使用MybatisPlus自带的过滤器进行配置 MybatisPlusConfig 测试方法如下 RunWith SpringRunne
  • 关于vue 引入两个版本echarts的坑。

    项目开发中 前端非要使用echarts3 0版本 我的业务又有地图需要显示 吐槽一下后端开发招进来变前端 一开始是引用了5 0版本的js文件 后来踩了很多坑就改成引用别名 控制台输入 npm i echarts5 npm echarts 5
  • .natvis的文件来问题总结 .natvis的文件来

    VS调试STL问题总结 C Program Files x86 Microsoft Visual Studio 2017 Community Common7 Packages Debugger Visualizers https www c
  • python实现Word2Vec+哈夫曼树+skip-gram

    阅读这篇之前如果对于层次softmax不清楚可以先看看http 124 222 190 191 8090 archives word2vec zhong de ha fu man shu 再来阅读代码 你将会有意外收获 1 数据集 百度云网
  • [Qt Quick] No rule to make target问题解决办法

    问题描述 修改项目中资源的qml文件名或删除无用资源文件后 重新构建项目时 会出现类似如下的问题提示 No rule to make target aaa needed by bbb Stop 使用快捷键 Alt 4 定位到编译输出窗口 可
  • 【IAP】IAP在线升级流程

    IAP 全称是 In Application Programming 中文解释为 在程序中编程 不同于ISP通过设置MCU内部的BootLoader程序引导烧写或者是ICP通过SWD JTAG在线仿真烧写 IAP是一种对通过微控制器的对外接
  • Java高并发之锁总结、常见的面试问题

    1 锁的分类 乐观锁与悲观锁 悲观锁 对共享数据进行访问时 悲观锁总是认为一定会有其他线程修改数据 如果不加锁 肯定会出问题 因此 悲观锁无论是否出现共享数据的争用 在访问数据时都会先加锁 Java中同步互斥都是采用这种悲观的并发策略 sy
  • HTTP协议接口

    主要特点 1 支持客户端 服务器模式 客户端向服务器请求服务时 只需传送请求方法和路径 常见的请求方法有GET POST 2 简单 3 灵活 HTTP允许传输任意类型的数据对象 正在传输的类型由ContentType加以标记 4 无连接 限
  • 「高并发业务必读」深入剖析 Java 并发包中的锁机制

    故事 程序员小张 刚毕业 参加工作1年左右 日常工作是CRUD 架构师老李 多个大型项目经验 精通各种屠龙宝术 小张和老李一起工作已有数月 双方在技术上也有了很多的交流 但是却总是存在一些争议 这一天 在公司年会上 他们两个意外地坐到了同桌
  • 单链表按照指定顺序插入节点(思路分析) [数据结构][Java]

    单链表按照特定顺序插入节点 思路分析 这里我们要实现在自定义的英雄链表中添加英雄时 根据排名将英雄插入到指定位置 如果有链表中已经有这个排名了 那么就添加失败 并且给出提示 思路分析 首先找到待添加结点位置的前一个位置 涉及到遍历 所以是通
  • python中导入TXT时,使用split()分割文本时,出现错误ValueError: not enough values to unpack (expected 2, got 1)

    Python中使用str split 时 一般都会有两个参数 比如 role words str split 1 注意split的 它必须和str中的冒号 str中必须有冒号 否则就会报错 都是同一种冒号 要么是英文半角 要么是中文冒号 如
  • easyx图形库-----贴图技巧之透明贴图与位运算(与运算、或运算、异或运算)

    目录 位运算 1 与运算 2 或运算 3 异或运算 2 图形库颜色位运算与透明贴图实现 相关操作码 透明贴图的实现 我们都知道电脑的系统处理方式都是以二进制去处理的 每一个数据的背后都是二进制数字0跟1表示 那么这一期我就来介绍怎么去利用二