EasyX 教程之基础篇
这里是 EasyX 教程的基础篇,想看入门篇的点这里。由于最近事情较多,因此更新较慢,高阶篇预计于
插入图片
如果你想在 EasyX 界面中插入图片,那么就往下看吧!
先以下面的图片为例。
先把这张图片保存到一个你喜欢的位置,我把它放在了 D 盘上。现在我们把鼠标光标对准图片,按下右键,再点击复制文件地址,现在你就得到了这张图片的完整地址。
接下来问题来了,怎么把这张图片放到 EasyX 界面中呢?先看看代码。
#include <bits/stdc++.h>
#include <easyx.h>
#include <graphics.h>
using namespace std;
int main()
{
initgraph(640, 480);
IMAGE ilw;//定义一个IMAGE类型的变量ilw。IMAGE类型用于存储图片
loadimage(&ilw, L"D:\\C++\\演示图片\\shop_bg.png", 640/*宽640像素*/, 480/*高480像素*/);//加载图片到ilw,&是用来取地址的,L"D:\\C++\\演示图片\\shop_bg.png"是图片地址,引号内的内容替换为你自己的图片地址,地址一定要完整,后面两项为缩放后的图片尺寸。
putimage(0/*图片左上角x坐标*/, 0/*图片左上角y坐标*/, &ilw);//显示图片,图片左上角x坐标为0,y坐标为0
Sleep(5000);
closegraph();
return 0;
}
不难发现,使用 putimage() 函数可以显示图片,而 loadimage() 只是预加载图片的。
去除背景
如果你想显示一张去除了背景的图片,就像下面这样。
你大概就会这么写。
#include <bits/stdc++.h>
#include <easyx.h>
#include <graphics.h>
using namespace std;
int main()
{
initgraph(640, 480);
IMAGE img;
IMAGE img2;
loadimage(&img, L"D:\\C++\\演示图片\\外太空.png", 640, 480);
putimage(0, 0, &img);
loadimage(&img2, L"D:\\C++\\演示图片\\战斗机.png", 100, 100);
putimage(200, 200, &img2);
Sleep(10000);
closegraph();
return 0;
}
结果出来后你就会大吃一惊。
这是什么???
其实你还没有掌握方法,接下来我来教你实现代码。 首先,你要把上面那张战斗机的图片去除背景(找修图软件去除就行,但记得裁剪一下去掉水印)。
弄好后按照上面的代码写一下。但这还没完,你需要手写一个 transparentimage 函数,函数如下。
void transparentimage(int x, int y, IMAGE img)
{
IMAGE img1;
DWORD* d1;
img1 = img;
d1 = GetImageBuffer(&img1);
float h, s, l;
for (int i = 0; i < img1.getheight() * img1.getwidth(); i++)
{
RGBtoHSL(BGR(d1[i]), &h, &s, &l);
if (l < 0.03)
{
d1[i] = BGR(WHITE);
}
if (d1[i] != BGR(WHITE))
{
d1[i] = 0;
}
}
putimage(x, y, &img1, SRCAND);
putimage(x, y, &img, SRCPAINT);
}
这个函数的具体流程和详解如下。
- 遍历 img1 的每个像素,转换为 HSL 色彩空间,提取亮度
l 。 - 如果亮度很低,也就是
l < 0.03 ,就认为是黑色背景,将该像素设为白色。 - 如果不是白色,就将该像素设成
0 ,也就是全透明。 putimage(x, y, &img1, SRCAND);是用 img1 以 SRCAND 模式绘制,保留目标区域的形状遮罩。putimage(x, y, &img, SRCPAINT);表示再用原图 img 以 SRCPAINT 模式绘制,让彩色部分叠加。
这样,我们就得到了完全去除背景的图片。
::::info[transparent 函数代码和详解部分内容来源于网络] ::::
最后,我们把这个函数加到原来的代码里,就大功告成了!
实现代码向下看。
#include <bits/stdc++.h>
#include <easyx.h>
#include <graphics.h>
using namespace std;
void transparentimage(int x, int y, IMAGE img)
{
IMAGE img1;
DWORD* d1;
img1 = img;
d1 = GetImageBuffer(&img1);
float h, s, l;
for (int i = 0; i < img1.getheight() * img1.getwidth(); i++)
{
RGBtoHSL(BGR(d1[i]), &h, &s, &l);
if (l < 0.03)
{
d1[i] = BGR(WHITE);
}
if (d1[i] != BGR(WHITE))
{
d1[i] = 0;
}
}
putimage(x, y, &img1, SRCAND);
putimage(x, y, &img, SRCPAINT);
}
int main()
{
initgraph(640, 480);
IMAGE img;
IMAGE img2;
loadimage(&img, L"D:\\C++\\演示图片\\外太空.png", 640, 480);
transparentimage(0, 0, img);//唯一不同的是把putimage变为transparentimage并去掉取地址符
loadimage(&img2, L"D:\\C++\\演示图片\\战斗机2.png", 100, 100);
transparentimage(200, 200, img2);
Sleep(10000);
closegraph();
return 0;
}
运行结果如下。
设置文字字体
接下来的几项讲解就是有关插入文字的了。
如果你想插入文字,就先要设置字体,我们可以用 settextstyle() 函数,先看示例代码。
settextstyle(22, 0, _T("微软雅黑"));
这个函数里的第一个参数是字体的高度,以像素为单位,第二个参数表示字体宽度,如果是 _T(),如果你设置的是多字节模式,第三个参数直接写 "微软雅黑" 就行,但如果你想要别的字体,填入字体名称即可。
设置文字颜色
既然要显示文字,那设置文字颜色就是必需的了。那这时我们就会用到 settextcolor() 函数。先看一下函数原型。
void settextcolor(COLORREF color)
那么用法是什么呢?其实很简单,只需要往 settextcolor() 函数的括号里填入颜色名称即可。例如 RED 等,也可以填入 0xFFFFFF。
示例代码如下。
settextcolor(RED);
settextcolor(0xFFFFFF);
显示文字
说了这么多,终于到了显示文字了。
先看示例代码。
#include <bits/stdc++.h>
#include <easyx.h>
#include <graphics.h>
int main()
{
initgraph(640, 480);
settextstyle(22, 0, _T("微软雅黑"));
settextcolor(0xFFFFFF);
outtextxy(100, 100, _T("Hello, EasyX!"));
Sleep(5000);
closegraph();
return 0;
}
运行结果如下。
现在就是详解时间。我们用的是 outtextxy() 函数来显示文字,第一个参数为所显示文字的 _T() 是为了让文字和 TCHAR 类型匹配。
广告
欢迎加团!
下期预告
在下期的高阶篇里我会给大家讲到如何做一个弹窗、如何把弹窗在被 EasyX 窗口默认挡住的情况下将其置顶、如何判断鼠标位置和判断鼠标是否按下等,我们下期再见!