BestAns

路漫漫其修远兮,吾将上下而求索

VC绘图/游戏简易教程--13:getimage / putimage / loadimag / saveimage / IMAGE 的用法 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

 getimage / putimage / loadimage / saveimage 这一组命令和 IMAGE 对象可以实现图像处理的相关功能,下面逐个介绍。
(有点类似 tc 中的 imagesize)

[加载图片]

实现加载图片主要分三步:

  1. 定义 IMAGE 对象
  2. 读取图片至 IMAGE 对象
  3. 显示 IMAGE 对象到需要的位置

很简单,我们看一下完整的代码:

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480);

	IMAGE img;	// 定义 IMAGE 对象
	loadimage(&img, _T("D:\\test.jpg"));	// 读取图片到 img 对象中
	putimage(0, 0, &img);	// 在坐标 (0, 0) 位置显示 IMAGE 对象

	_getch();
	closegraph();
	return 0;
}

注意要显示的图片是 D:\test.jpg,你可以修改为自己的图片路径。

如果只需要加载图片到绘图窗体上, 那么请将 loadimage 的第一个参数设置为 NULL 即可,这样就不需要定义 IMAGE 对象了。

[保存屏幕区域]

和加载图片类似,我们可以从屏幕的某个区域加载图像至 IMAGE 对象,然后再 putimage 到需要的地方。

获取屏幕区域的代码格式:
getimage(IMAGE& img, int x, int y, int w, int h);
参数说明:
    img: 保存该屏幕区域的 IMAGE 对象
    x, y: 区域的左上角坐标
    w, h: 区域的宽和高(注意:不是右下角坐标)

看代码:

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480);

	// 定义 IMAGE 对象
	IMAGE img;

	// 绘制内容
	circle(100, 100, 20);
	line(70, 100, 130, 100);
	line(100, 70, 100, 130);

	// 保存区域至 img 对象
	getimage(&img, 70, 70, 60, 60);

	// 将 img 对对象显示在屏幕的某个位置
	putimage(200, 200, &img);

	_getch();
	closegraph();
	return 0;
}

[移动复杂的图案]

复杂的图案如果要移动,每次都重新绘制显然效率很低,移动的时候会出现严重的屏幕闪烁。

而 getimage / putimage 的效率十分高,我们可以将复杂的图案用 getimage 保存下来,然后再逐步 putimage 实现复杂图案的移动。
这个代码就不举例了,作为作业大家练习吧。

[更多的功能]

getimage / putimage 有许多重载,这里就不多介绍了,详细看看帮助中的描述吧。
读取图片的技巧:将图片内嵌到 exe 文件中,请参见:http://www.easyx.cn/skills/View.aspx?id=6

[作业]

  1. 用线条、圆等各种基础绘图语句画一个“汽车”,然后用 getimage / putimage 实现该“汽车”的平滑移动。
  2. 自己学一下帮助中 BeginBatchDraw / FlushBatchDraw / EndBatchDraw 三个函数,可以进一步优化“平滑移动”的效果。这三个命令挺简单的,一看就懂。

评论 (5) -

  • 作业1 汽车移动
    #include <graphics.h>
    #include <conio.h>
    void graphMYcar()
    {
      // 绘制内容
      setfillcolor(RGB(99, 166, 162));
      POINT pts1[] = { {100, 100}, {200, 100},  {250, 140},{50, 140} };
      solidpolygon(pts1, 4);//填充多边形
      solidrectangle(30, 140, 270, 200);//实心矩形
      solidcircle(30, 170, 30);//实心圆
      solidcircle(270, 170, 30);//实心圆
      setfillcolor(RGB(207, 233, 238));
      POINT pts2[] = { {110, 110}, {130, 110},  {130, 140},{70, 140} };
      solidpolygon(pts2, 4);//填充多边形
      POINT pts3[] = { {140, 110}, {190, 110},  {230, 140},{140, 140} };
      solidpolygon(pts3, 4);//填充多边形
      setfillcolor(BLACK);
      solidcircle(80, 200, 30);//实心圆
      solidcircle(220, 200, 30);//实心圆
      setfillcolor(RGB(117, 192, 186));
      solidcircle(80, 200, 20);//实心圆
      solidcircle(220, 200, 20);//实心圆
      setfillcolor(BLACK);
      solidcircle(80, 200, 7);//实心圆
      solidcircle(220, 200, 7);//实心圆
    }
    int main()
    {
      initgraph(1200, 400);
      //设置背景颜色
      setbkcolor(WHITE);
      cleardevice();
      // 定义 IMAGE 对象
      IMAGE img;
      // 绘制内容
      BeginBatchDraw();
      graphMYcar();
      // 保存区域至 img 对象
      getimage(&img, 0, 100, 300, 230);

      // 将 img 对对象显示在屏幕的某个位置
      for (int i = 0; i <1201; i +=2)
      {
        if (i == 1200) i = -300;
        setbkcolor(WHITE);
        cleardevice();
        putimage(i, 100, &img);
        FlushBatchDraw();
        Sleep(10);
      }
      EndBatchDraw();
      _getch();
      closegraph();
      return 0;
    }
  • 那个加载图像的时候我的运行框就是黑乎乎的,求解答
    • 斜杆的话要用两个,转义字符的问题,反斜杠只要一个
    • 我也是黑乎乎的
      • 我也是,我发现了。你把路径的反斜杠改成斜杠应该可以了。直接复制的路径是反斜杠,改成斜杠我就可以了

添加评论