关于EasyX和graphics.h的那些事(下)
PS:如有疑问,请参阅结尾处的注意
咳咳,本来说过一个星期就要把下篇更新出来,可是因为一些原(偷)因(懒)却迟迟没有更新。
算了,我们今天不就更新了么!?
言归正传,今天我们接着上一次的继续。上一篇我们讲了如何用EasyX库来绘制图形,但是,我已经听到了小伙伴的呼声
啊~我的天哪,我画图画得都要晕了,效率也很低,有没有什么办法来拯救一下呀?
当然是有的,你可以先画好图片,然后用EasyX自带的图片输出功能输出图片,而且还很高清。例如这张图:
PS:学习资源我已经发在了百度网盘上(编译环境:Visual Studio 2019)
传送门:https://pan.baidu.com/s/1ujM1ShEqhB4s3QUcl1vc7A
提取码:q887
图片输出
那么我们来讲一讲图片输出,例如我们想要显示一张名叫I Love C++.jpg的1920*1034大小的图片
initgraph(500, 500);//定义窗口大小
IMAGE C;//定义图片对象
loadimage(&C, _T("I Love C++.jpg"));//加载图片
putimage(0, 0, &C);//输出图片
其中initgraph函数我们在上一篇讲过了,它是用于初始化图形系统的一个函数。
通过使用Visual Studio的转到定义功能得知,IMAGE则是用于定义图像的一个类:
而loadimage()函数是用于加载图片的,有如下参数:
参数 | 用途 |
---|---|
图片变量 | 用于存储图像地址 |
文件名 | 要显示的图片的名称(需要附带后缀名,并且与程序放在同一文件夹下) |
还有putimage()函数的作用是显示图片,参数列表如下:
参数 | 用途 |
---|---|
图片变量 | 指定显示什么图片 |
窗口中的x轴 | 指定图片显示在窗口中x轴的位置 |
窗口中的y轴 | 指定图片显示在窗口中y轴的位置 |
这下舒服了,终于不用天天在控制台里printf(xxx);了,无论多么绚丽的图片我们显示出来了。
动图输出
虽然学会了输出图片,但总觉得缺了点什么,要是能够让图片动起来就更好了!
思路:利用人的视觉差,每过X秒输出一张图片,这样就可以了。例如:
#include<graphics.h>
int main() {
initgraph(500, 500);//定义窗口大小
IMAGE Face1, Face2, Face3;//定义图片对象
/***********加载图片************/
loadimage(&Face1, _T("Face1.bmp"));
loadimage(&Face2, _T("Face2.bmp"));
loadimage(&Face3, _T("Face3.bmp"));
/***********输出图片*************/
for (;;) {
putimage(0, 0, &Face1);
Sleep(200);
putimage(0, 0, &Face2);
Sleep(200);
putimage(0, 0, &Face3);
Sleep(200);
}
return 0;
}
PS:项目名称Happy(👆此代码是修改过的)
然后结果就:
(⊙﹏⊙)有点丑不要紧😂😂😂(可以自己改的嘛),重要的是你学会了吗?
使背景透明
刚刚实现了动图的显示,但是如果我们想这个动图加一个背景的话,就会变成··········································································································
笑脸周围会有一圈空白,我们当然是想要这样的效果:
于是,就诞生了TransparentBlt()这个函数
TransparentBlt()函数
这个函数是用于使图片中的某一中颜色透明,并把该图像显示在窗口上。例如:
#include<graphics.h>
#pragma comment(lib, "Msimg32.lib")//使用TransparentBlt函数必须带此库
int main() {
initgraph(1000, 600);//定义窗口大小
IMAGE Face1, Face2, Face3, background;
/****************加载图片********************/
loadimage(&Face1, _T("Face1.bmp"));
loadimage(&Face2, _T("Face2.bmp"));
loadimage(&Face3, _T("Face3.bmp"));
loadimage(&background, _T("background.bmp"));
HDC hdc = GetImageHDC();//获取窗口句柄
/****************获取图片句柄********************/
HDC Face1DC = GetImageHDC(&Face1);
HDC Face2DC = GetImageHDC(&Face2);
HDC Face3DC = GetImageHDC(&Face3);
putimage(0, 0, &background);
/****************使图片背景透明并显示图片********************/
for (;;) {
//*****编号******1**2**3***4****5*******6****7**8****9***10************11********/
TransparentBlt(hdc, 0, 0, 500, 500, Face1DC, 0, 0, 500, 500, RGB(255, 255, 255));
Sleep(200);
TransparentBlt(hdc, 0, 0, 500, 500, Face2DC, 0, 0, 500, 500, RGB(255, 255, 255));
Sleep(200);
TransparentBlt(hdc, 0, 0, 500, 500, Face3DC, 0, 0, 500, 500, RGB(255, 255, 255));
Sleep(200);
}
system("pause");//暂停
return 0;
}
RGB颜色
RGB色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。
窗口句柄
Q:句柄是什么?
A:句柄是一个是用来标识对象或者项目的标识符。
Q:窗口句柄是什么?
A:因为Windows是一个多任务的操作系统,而系统为了辨识用户正在操作的程序,就诞生了窗口句柄。也就是说每一个对象(Windows操作系统下的任何东西)都有一个句柄,而图片句柄也是同样的道理。(这是我的理解,如有错误,请指出。参考:https://blog.csdn.net/wyx0224/article/details/83385168)
现在来正式讲解TransparentBlt()函数。
编号 | 参数类型 | 用途 |
---|---|---|
1 | HDC | 获取窗口句柄 |
2 | int | 在窗口上的x轴坐标 |
3 | int | 在窗口上的y轴坐标 |
4 | int | 在窗口上要显示的宽度 |
5 | int | 在窗口上要显示的高度 |
6 | HDC | 获取图像句柄 |
7 | int | 在原图像的x轴坐标 |
8 | int | 在原图像的y轴坐标 |
9 | int | 在原图像取的宽度 |
10 | int | 在原图像取的高度 |
11 | uint | 要透明的颜色(RGB值) |
使用这个函数时要注意需要添加#pragma comment(lib, “Msimg32.lib”)库,因为这个库内包含了TransparentBlt函数
然后再打一遍代码,你就会发现空白部分消失了。
注意
1.TransparentBlt函数会透明所有的颜色,如果背景是和内容是同一个颜色,那么内容和背景都会透明,因此,背景应尽量选择不常用的颜色
2.程序可能会输出一片黑,像是这样:
其实只需要打开Debug文件夹下的程序,你就会发现是可以显示的:
3.文章中的代码可能与网盘资源里的代码不同
4.如果不会下载EasyX库,请参阅关于EasyX和graphics.h的那些事(上)
传送门:https://blog.csdn.net/xiaochanmao0804/article/details/107335821
PS:不知道为什么CSDN下载总是上传失败,所以挂在了百度网盘上
5.蓝奏云网盘资源
传送门:https://wws.lanzous.com/iDrlIl4y4ha
提取码:4j7w