跳到主要内容

图片 Image

Image() 控件让你能在 HiEasyX 的窗口里显示一张图片。它的数据源是 EasyX 的 IMAGE 对象(或者说是一块内存缓冲区),所以你可以加载本地图片、显示程序生成的图像,甚至把其他 EasyX 绘图结果嵌入到 UI 中。

核心概念

HiEasyX 的 Image() 不直接负责"加载图片文件",它只负责"显示已经准备好的图像数据"。加载文件的工作仍然由 EasyX 的 loadimage() 完成,或者你可以自己往 IMAGE 缓冲区里绘制内容。


函数原型

void Image(void *Buffer, HXPoint Size = {-1, -1});

参数说明

参数类型默认值说明
Buffervoid *指向 EasyX IMAGE 对象的指针。注意这里是 void*,实际传入 IMAGE* 即可。
SizeHXPoint{-1, -1}显示尺寸。{-1, -1} 表示按图片原始尺寸显示;否则按指定宽高拉伸。

返回值

Image() 没有返回值。它纯粹是一个渲染指令。


两种尺寸模式

按原始尺寸显示

如果你希望图片保持原有的宽高,把 Size 留为默认的 {-1, -1}

IMAGE img;
loadimage(&img, HXStr("photo.jpg"));

// 原始大小显示
HX::Image(&img);

自定义显示尺寸

如果你希望把图片缩放到固定大小(比如做缩略图、头像、图标),手动传入 Size

// 强制缩放到 200 x 150
HX::Image(&img, {200, 150});
拉伸算法说明

HiEasyX 底层使用 EasyX 的图像绘制接口。拉伸时采用的是简单的双线性或最近邻插值(取决于 EasyX 版本和具体实现)。如果你需要高质量的缩放,建议在外部用其他库预处理好再传入。


加载图片文件

HiEasyX 本身不提供文件加载函数,你需要配合 EasyX 的标准 API:

#include <graphics.h>  // EasyX 头文件

// 加载图片
static IMAGE photo;
loadimage(&photo, HXStr("assets/background.png"));

// 在窗口中显示
HX::Image(&photo);
路径注意

EasyX 的 loadimage 在 Unicode 模式下接收宽字符路径,所以使用 HXStr("...")L"..." 是正确的。如果加载失败(文件不存在或格式不支持),IMAGE 对象可能为空,此时 Image() 可能无法正确显示。建议在加载后检查图片尺寸。


显示动态生成的图像

Image() 的强大之处在于:你可以先往 IMAGE 里画任何东西,再把它嵌入 UI:

// 创建一个 256x256 的缓冲区
static IMAGE canvas;
SetWorkingImage(&canvas);
setfillcolor(GREEN);
solidcircle(128, 128, 100); // 画一个绿圆
SetWorkingImage(NULL); // 恢复默认画布

// 把这个圆显示在 UI 里
HX::Image(&canvas, {128, 128});

这种用法在需要做小地图、实时预览、缩略图时非常有用。


完整示例代码

下面的示例加载一张图片(如果加载失败就画一个替代图案),并展示了原始尺寸显示和自定义尺寸显示两种模式。

#include <include/hex.h>
#include <include/impl/EasyX/hex_impl_easyx.h>

#include <graphics.h>
#include <string>

int main() {
initgraph(1024, 768);
setbkcolor(WHITE);
cleardevice();

HX::HXInitForEasyX();
HX::SetBuffer(GetWorkingImage());

BeginBatchDraw();

// ===== 加载图片(全局/ static 生命周期) =====
static IMAGE photo;
// 尝试加载一张图片;如果失败,我们就自己画一个占位图
bool loaded = (loadimage(&photo, HXStr("test.jpg")) == 0);
if (!loaded) {
// 自己画一个 300x200 的彩色占位图
SetWorkingImage(&photo);
resize(&photo, 300, 200);
setfillcolor(MAGENTA);
solidrectangle(0, 0, 300, 200);
settextcolor(WHITE);
settextstyle(20, 0, HXStr("微软雅黑"));
outtextxy(80, 90, HXStr("图片加载失败"));
SetWorkingImage(NULL);
}

// ===== 创建第二个 IMAGE:程序生成的图案 =====
static IMAGE pattern;
resize(&pattern, 200, 200);
SetWorkingImage(&pattern);
for (int y = 0; y < 200; ++y) {
for (int x = 0; x < 200; ++x) {
int r = (x * 255) / 200;
int g = (y * 255) / 200;
int b = 128;
putpixel(x, y, RGB(r, g, b));
}
}
SetWorkingImage(NULL);

// ===== 必须是 static 或全局变量 =====
static HX::WindowProfile wp;
wp.Size = {600, 500};
wp.Position = {200, 100};

while (true) {
HX::HXBegin();

ExMessage msg;
while (peekmessage(&msg)) {
HX::PushMessage(HX::GetHXMessage(&msg));
}

HX::Window(HXStr("Image 演示"), wp);

HX::Text(HXStr("原始尺寸显示:"));
HX::Image(&photo); // 原始大小

HX::Text(HXStr("自定义尺寸 (150x100):"));
HX::Image(&photo, {150, 100}); // 强制缩放

HX::Text(HXStr("程序生成的渐变图案 (100x100):"));
HX::Image(&pattern, {100, 100});

HX::End();
HX::Render();
FlushBatchDraw();
Sleep(16);
}

closegraph();
return 0;
}
小建议

如果你想让 Image() 显示的内容跟随窗口布局自动换行,就把它当成普通控件放在 Window() 里即可。HiEasyX 会自动处理它的排布位置,你不需要手动计算坐标。

关于内存管理

IMAGE 对象是 EasyX 管理的资源。如果你在程序运行期间加载很多大图,记得在不需要时调用 delete(对 IMAGE*)或者让它们的生命周期与程序一致。HiEasyX 的 Image() 不会复制图像数据,它只是引用你传入的缓冲区。

运行效果

截图占位符:请补充 $name 控件的运行效果截图。

截图占位符:请补充 Image 运行效果 的运行效果截图,保存为 ./assets/Image_view.png。`n