如何在C语言中使用graphics.h绘图?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

什么是 graphics.h

graphics.h 是一个非标准的 C 语言头文件,由 Borland 公司在其著名的 Turbo C/C++ 编译器中提供,它提供了一系列简单易用的函数,允许程序员在 DOS 环境下直接操作图形模式,绘制点、线、圆、矩形等基本图形,并处理图像和颜色。

c 语言 graphics.h
(图片来源网络,侵删)

核心特点:

  • 简单易用:API 设计直观,函数名如 circle(), line(), rectangle() 等一看就懂。
  • 功能有限:主要支持 2D 图形,功能远不如现代图形库(如 OpenGL, DirectX, SDL)强大。
  • 平台依赖性强:它是为特定的 DOS 环境和硬件(VGA, EGA 卡)设计的,无法在现代的 Windows、Linux 或 macOS 上直接编译运行。
  • 历史意义:它是无数程序员(尤其是在中国和印度)接触计算机图形学的“启蒙老师”,在 90 年代到 21 世纪初非常流行。

如何使用 graphics.h(以 Turbo C 为例)`

使用 graphics.h 的基本流程非常固定,通常遵循以下五个步骤:

步骤 1: 包含头文件

#include <graphics.h> // 包含图形库头文件
#include <conio.h>    // 用于 getch() 等控制台函数
#include <stdlib.h>   // 用于 exit() 函数

步骤 2: 初始化图形驱动

在使用任何图形函数之前,必须先将屏幕从文本模式切换到图形模式,这通过 initgraph() 函数完成。

initgraph() 函数原型:

c 语言 graphics.h
(图片来源网络,侵删)
void initgraph(int *driver, int *mode, char *path);
  • driver: 指向图形驱动程序类型的指针,常用 DETECT,它会自动检测你的硬件并使用最高级的可用模式。
  • mode: 指向图形模式的指针。driver 设置为 DETECTmode 会被自动设置为检测到的模式。
  • path: 图形驱动程序文件(.BGI)所在的路径,如果放在当前目录下,可以设置为空字符串 。

示例代码:

int gd = DETECT, gm; // gd = Graph Driver, gm = Graph Mode
initgraph(&gd, &gm, ""); // 自动检测并初始化图形模式

步骤 3: 使用图形函数进行绘制

初始化成功后,你就可以调用各种绘图函数了。

常用绘图函数:

  • void putpixel(int x, int y, int color); // 在指定位置画一个点
  • void line(int x1, int y1, int x2, int y2); // 画一条直线
  • void circle(int x, int y, int radius); // 画一个圆
  • void rectangle(int left, int top, int right, int bottom); // 画一个矩形
  • void outtextxy(int x, int y, char *string); // 在指定位置输出文本

颜色相关:

  • int getcolor(); // 获取当前绘图颜色
  • void setcolor(int color); // 设置当前绘图颜色
  • void setfillstyle(int pattern, int color); // 设置填充模式和颜色
  • void floodfill(int x, int y, int bordercolor); // 填充一个封闭区域

示例代码:

// 设置绘图颜色为红色
setcolor(RED);
// 画一个圆
circle(320, 240, 100);
// 设置填充样式为黄色实心
setfillstyle(SOLID_FILL, YELLOW);
// 填充圆的内部
floodfill(320, 240, RED);
// 在圆心位置输出文字
outtextxy(300, 240, "Hello, Graphics!");

步骤 4: 关闭图形模式

程序结束前,需要关闭图形模式,返回到文本模式,以便在控制台看到最终结果或进行其他操作。

closegraph() 函数用于此目的。

示例代码:

closegraph(); // 关闭图形模式,返回文本模式

步骤 5: 完整示例代码

下面是一个完整的示例,它将绘制一个红色的圆,并填充黄色。

#include <graphics.h>
#include <conio.h>
int main() {
    // 1. 初始化图形模式
    int gd = DETECT, gm;
    initgraph(&gd, &gm, ""); // 自动检测硬件并初始化
    // 2. 绘制图形
    // 设置圆的边框颜色为红色
    setcolor(RED);
    // 画一个圆,圆心(320, 240),半径100
    circle(320, 240, 100);
    // 设置填充模式为黄色实心
    setfillstyle(SOLID_FILL, YELLOW);
    // 填充圆的内部 (从圆心(320, 240)开始填充,边界颜色为红色)
    floodfill(320, 240, RED);
    // 在圆心位置输出文字
    outtextxy(300, 240, "Hello, Graphics!");
    // 3. 等待用户按键
    getch(); // 暂停程序,等待用户按任意键
    // 4. 关闭图形模式
    closegraph();
    return 0;
}

如何编译和运行:

  1. 你需要一个 Turbo C/C++ 编译器(tc.exe)。
  2. 将代码保存为 .c 文件(draw.c)。
  3. 在 Turbo C 中打开该文件,按 F9 编译,然后按 Ctrl+F9 运行。
  4. 程序会弹出一个图形窗口,显示一个黄色的圆,按任意键后窗口关闭,返回到编辑器。

graphics.h 的局限性

为什么 graphics.h 被淘汰了?主要有以下几个原因:

  1. 平台不兼容:它是为 DOS 设计的,在 Windows 上,你可以使用一些“复古”的编译器(如 Turbo C++ 3.0 for Windows)或第三方库(如 WinBGIm)来模拟,但体验很差,在 Linux 和 macOS 上则几乎无法使用。
  2. 功能过时:它只支持非常基础的 2D 图形,无法处理 3D 图形、纹理、光照、现代窗口系统等。
  3. 性能低下:其底层实现依赖于古老的 BIOS 和 VGA 寄存器操作,与现代的 GPU 加速图形 API 相比,性能有天壤之别。
  4. 非标准:它不是 C 或 C++ 语言标准的一部分,任何现代的、遵循标准的编译器(如 GCC, Clang, MSVC)都不包含它。

现代替代方案

如果你想在 C/C++ 中进行图形编程,应该学习以下现代、跨平台的图形库:

库/框架 类型 难度 适用平台 主要特点
EasyX 2D Windows API 简单 Windows graphics.h 在 Windows 下的最佳替代品,API 风格极其相似,非常适合入门。
SFML 2D/3D 多媒体库 中等 Windows, Linux, macOS 面向对象,功能强大(图形、音频、网络、输入),跨平台,是学习现代 C++ 图形编程的优秀选择。
SDL (Simple DirectMedia Layer) 2D/3D 多媒体库 中等 Windows, Linux, macOS 轻量级,底层,被广泛用于开发独立游戏(如 "Stardew Valley"),需要配合 OpenGL 进行 3D 渲染。
Raylib 2D/3D 游戏库 简单 Windows, Linux, macOS 现代设计,单头文件,易于上手,非常适合快速开发 2D/3D 游戏和原型。
OpenGL 3D 图形 API 困难 Windows, Linux, macOS 行业标准的 3D 图形 API,功能极其强大,但学习曲线陡峭,需要理解大量图形学概念。
DirectX 3D 图形 API 困难 Windows 微软开发的 Windows 平台专属 API,性能优异,主要用于商业游戏开发。

建议:

  • 如果你只是想重温旧梦或体验 graphics.h 的简单性,并且只在 Windows 上开发:可以尝试 EasyX
  • 如果你是初学者,想学习现代、跨平台的 C++ 图形编程RaylibSFML 是绝佳的起点。
  • 如果你想深入学习计算机图形学,立志于游戏或 3D 开发:最终需要掌握 OpenGLDirectX

graphics.h 是一个时代的产物,它以其简单直观的方式,点燃了无数人对计算机图形学的兴趣,虽然它已不再适用于现代开发,但理解它的工作原理和基本绘图流程,对于学习计算机图形学的基础概念(如坐标系统、像素、颜色模型等)仍然非常有价值,当你准备好迈向更广阔的图形世界时,请转向上述提到的现代替代方案。

-- 展开阅读全文 --
头像
管理为何不显示?
« 上一篇 01-14
dede自定义表单提交404
下一篇 » 01-15

相关文章

取消
微信二维码
支付宝二维码

目录[+]