Easyx图片操作
1. 图片保存(IMAGE)
class IMAGE(int width = 0, int height = 0);
共有成员
- getwidth():返回 IMAGE 对象的宽度,以像素为单位。
- getheight():返回 IMAGE 对象的高度,以像素为单位。
- operator =:实现 IMAGE 对象的直接赋值。该操作仅拷贝源图像的内容,不拷贝源图像的绘图环境。
2. 图片加载(loadimage)
loadimage函数用于从文件中读取图像
// 从图片文件获取图像(bmp/gif/jpg/png/tif/emf/wmf/ico)
void loadimage(
IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针
LPCTSTR pImgFile, // 图片文件名
int nWidth = 0, // 图片的拉伸宽度
int nHeight = 0, // 图片的拉伸高度
bool bResize = false // 是否调整 IMAGE 的大小以适应图片
);
// 从资源文件获取图像(bmp/gif/jpg/png/tif/emf/wmf/ico)
void loadimage(
IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针
LPCTSTR pResType, // 资源类型
LPCTSTR pResName, // 资源名称
int nWidth = 0, // 图片的拉伸宽度
int nHeight = 0, // 图片的拉伸高度
bool bResize = false // 是否调整 IMAGE 的大小以适应图片
);
- pDstImg:保存图像的 IMAGE 对象指针。如果为 NULL,表示图片将读取至绘图窗口。
- pImgFile:图片文件名。支持 bmp / gif / jpg / png / tif / emf / wmf / ico 格式的图片。gif 格式的图片仅加载第一帧;gif 与 png 均不支持透明。
- nWidth:图片的拉伸宽度。加载图片后,会拉伸至该宽度。如果为 0,表示使用原图的宽度。
- nHeight:图片的拉伸高度。加载图片后,会拉伸至该高度。如果为 0,表示使用原图的高度。
- bResize:是否调整 IMAGE 的大小以适应图片。
- pResType:图片资源类型。
- pResName:图片资源名称。
- 返回值:无
备注
如果创建 IMAGE 对象的时候没有指定宽高,可以通过 Resize 函数设置。
对于没有设置宽高的 IMAGE 对象,执行 loadimage 会将其宽高设置为和读取的图片一样的尺寸。
Resize函数
// 这个函数用于调整指定绘图设备的尺寸。
void Resize(
IMAGE* pImg,
int width,
int height
);
- pImg:指定要调整尺寸的绘图设备。如果为 NULL,则表示默认绘图窗口。
- width:指定绘图设备的宽度。
- height:指定绘图设备的高度。
- 返回值:无
3. 图片显示(putimage)
// 绘制图像
void putimage(
int dstX, // 绘制位置的 x 坐标
int dstY, // 绘制位置的 y 坐标
IMAGE *pSrcImg, // 要绘制的 IMAGE 对象指针
DWORD dwRop = SRCCOPY // 三元光栅操作码
);
// 绘制图像(指定宽高和起始位置)
void putimage(
int dstX, // 绘制位置的 x 坐标
int dstY, // 绘制位置的 y 坐标
int dstWidth, // 绘制的宽度
int dstHeight, // 绘制的高度
IMAGE *pSrcImg, // 要绘制的 IMAGE 对象指针
int srcX, // 绘制内容在 IMAGE 对象中的左上角 x 坐标
int srcY, // 绘制内容在 IMAGE 对象中的左上角 y 坐标
DWORD dwRop = SRCCOPY // 三元光栅操作码
);
- 参数看函数原型的注释
备注
三元光栅操作码(即位操作模式),支持全部的 256 种三元光栅操作码,常用的几种如下:
值 | 含义 |
---|---|
DSTINVERT | 目标图像 = NOT 目标图像 |
MERGECOPY | 目标图像 = 源图像 AND 当前填充颜色 |
MERGEPAINT | 目标图像 = 目标图像 OR (NOT 源图像) |
NOTSRCCOPY | 目标图像 = NOT 源图像 |
NOTSRCERASE | 目标图像 = NOT (目标图像 OR 源图像) |
PATCOPY | 目标图像 = 当前填充颜色 |
PATINVERT | 目标图像 = 目标图像 XOR 当前填充颜色 |
PATPAINT | 目标图像 = 目标图像 OR ((NOT 源图像) OR 当前填充颜色) |
SRCAND | 目标图像 = 目标图像 AND 源图像 |
SRCCOPY | 目标图像 = 源图像 |
SRCERASE | 目标图像 = (NOT 目标图像) AND 源图像 |
SRCINVERT | 目标图像 = 目标图像 XOR 源图像 |
SRCPAINT | 目标图像 = 目标图像 OR 源图像 |
注:
- AND / OR / NOT / XOR 为布尔运算。
- "当前填充颜色"是指通过 setfillcolor 设置的用于当前填充的颜色。
- 查看全部的三元光栅操作码请参考这里:三元光栅操作码。
4. 双缓冲绘图
BeginBatchDraw
这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。
void BeginBatchDraw();
EndBatchDraw
这个函数用于结束批量绘制,并执行未完成的绘制任务。
// 结束批量绘制,并执行未完成的绘制任务
void EndBatchDraw();
// 结束批量绘制,并执行指定区域内未完成的绘制任务
void EndBatchDraw(
int left,
int top,
int right,
int bottom
);
- left:指定区域的左部 x 坐标。
- top:指定区域的上部 y 坐标。
- right:指定区域的右部 x 坐标。
- bottom:指定区域的下部 y 坐标。
- 返回值:无
FlushBatchDraw
这个函数用于执行未完成的绘制任务。
// 执行未完成的绘制任务
void FlushBatchDraw();
// 执行指定区域内未完成的绘制任务
void FlushBatchDraw(
int left,
int top,
int right,
int bottom
);
- left:指定区域的左部 x 坐标。
- top:指定区域的上部 y 坐标。
- right:指定区域的右部 x 坐标。
- bottom:指定区域的下部 y 坐标。
- 返回值:无
5. 实例
#include <easyx.h>
#include <conio.h>
int main(void) {
// 1. 初始化图形设备
initgraph(400, 400);
// 2. to do ......
IMAGE image; // 定义存储图片的变量
loadimage(&image, L"bk.png"); // 加载图片
int y = -image.getheight() + 400;
while (true) {
cleardevice(); // 清屏
BeginBatchDraw(); // 开始批量绘图
putimage(0, y, &image); // 显示图片
if (y >= -400) y = -image.getheight() + 400;
else y += 10;
Sleep(200);
EndBatchDraw(); // 结束批量绘图
}
_getch();
// 3. 关闭图形化设备,并释放资源
closegraph();
return 0;
}