EasyX 教程之基础篇

· · 科技·工程

这里是 EasyX 教程的基础篇,想看入门篇的点这里。由于最近事情较多,因此更新较慢,高阶篇预计于 1 个月后创作完成。话不多说,正篇开始!

插入图片

如果你想在 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);
}

这个函数的具体流程和详解如下。

  1. 遍历 img1 的每个像素,转换为 HSL 色彩空间,提取亮度 l
  2. 如果亮度很低,也就是 l < 0.03,就认为是黑色背景,将该像素设为白色。
  3. 如果不是白色,就将该像素设成 0,也就是全透明。
  4. putimage(x, y, &img1, SRCAND); 是用 img1 以 SRCAND 模式绘制,保留目标区域的形状遮罩。
  5. 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("微软雅黑"));

这个函数里的第一个参数是字体的高度,以像素为单位,第二个参数表示字体宽度,如果是 0 表示自适应宽度(程序自动帮你调好宽度,推荐这种方法),但如果写别的数字就代表手动设定字体宽度,但一设置不好字体就容易变形(不推荐),第三个参数表示字体的名称,因为 Visual 默认是单字节模式,所以要加入 _T(),如果你设置的是多字节模式,第三个参数直接写 "微软雅黑" 就行,但如果你想要别的字体,填入字体名称即可。

设置文字颜色

既然要显示文字,那设置文字颜色就是必需的了。那这时我们就会用到 settextcolor() 函数。先看一下函数原型。

void settextcolor(COLORREF color)

那么用法是什么呢?其实很简单,只需要往 settextcolor() 函数的括号里填入颜色名称即可。例如 RED 等,也可以填入 16 进制的颜色,如 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() 函数来显示文字,第一个参数为所显示文字的 x 坐标,第二个参数为所显示文字的 y 坐标(坐标位置为所显示文字的第一个字符的左上角),第三个参数就是要显示的文字(中英文都可以显示)。加 _T() 是为了让文字和 TCHAR 类型匹配。

广告

欢迎加团!

下期预告

在下期的高阶篇里我会给大家讲到如何做一个弹窗、如何把弹窗在被 EasyX 窗口默认挡住的情况下将其置顶、如何判断鼠标位置和判断鼠标是否按下等,我们下期再见!