如何用C语言从80*25分辨率BMP图片中提取文字图像并转换为字符点阵显示?

2026-05-19 12:331阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1136个文字,预计阅读时间需要5分钟。

如何用C语言从80*25分辨率BMP图片中提取文字图像并转换为字符点阵显示?

使用C语言编程读取80%*25分辨率的BMP图像中的文字图像,以字符点阵的形式显示。在编写此程序之前,需要了解一些BMP位图文件的基本知识:

1. 24位BMP文件基本结构:14字节文件头(包括文件类型、文件大小、保留字段、偏移量等)。

用c语言编程读取80*25分辨率的BMP图片中的文字图像以字符点阵的形式显示。

写这个程序之前得了解一下BMP位图文件的一些基础知识

前提知识: 一、24位BMP(bitmap)文件基本结构: 14字节文件头 + 40字节信息头 + 位图像素数据(一个像素3个字节:蓝色分量(1字节)、绿色分量(1字节)、红色分量(1字节))。

注意:存储位图像素数据时是从左下角像素开始,从左到右,从下到上,直至最右上的那个像素。

14字节文件头:

​ 位图标志(BM: 2字节)、文件大小(4字节)、保留字节(保留4个字节,值为0)、第一个图像像素信息距离文件头的偏移植(4字节)。

40字节信息头:

​ 信息头长度(4字节,一般值是40,即信息头长40字节)、图像的宽度(4字节,单位像素)、图像的高度(4字节,单位像素)、

​ 目标设备颜色平面数(2字节,固定设置为2字节,固定设置值为1)、每像素所占的比特位数(2字节)、

​ 图像数据压缩的类型(4字节,24位颜色值的位图一般该值为0,表示不压缩)、

如何用C语言从80*25分辨率BMP图片中提取文字图像并转换为字符点阵显示?

​ 图像所有像素占的字节数(4字节,一般为宽度 * 高度 * 每个像素所占的颜色字节数)、

​ 水平分辨率(4字节,用像素/米表示,一般为0缺省)、垂直分辨率(4字节,用像素/米表示,一般为0缺省)、

​ 颜色表中的颜色索引数(4字节,如果没用一般为0)、对图像显示有重要影响的颜色索引数(4字节,如果没用一般为0)。

位图像素数据(24位位图):由左下角像素开始,由左向右,由下向上,到最右上角的像素。

左下角最后一行第一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

左下角最后一行第二个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

. . . . . .

左下角最后一行最后一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

. . . . . .

左上角第一行第一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

. . . . . .

右上角第一行最后一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)。

注意:位图数据中每个扫描行的字节数必须是4的倍数。如果不足要用0补齐。

程序实现:

使用到了命令行参数

int main(int argc,char* argv[]) { /* 用c语言读取80*25点阵的24位的BMP位图然后在字符模式下显示*/ FILE* fp; //指向图像文件的文件指针 int width, height; //图像的宽度和高度(单位像素) char pix, blank; //pix:存放读取的像素分量数据, //blank:存放图片的背景颜色(第一个读取出来的值作为背景,以后不是背景色的像素我们都画出来) if (argc != 2) { printf("传入参数个数错误"); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("%s图像文件不存在!\n",argv[1]); exit(0); } fseek(fp, 18, SEEK_SET);//将文件读写指针移动到文件头偏移为18字节处 fread(&width, sizeof(int), 1, fp); //读取图像的宽度 fread(&height, sizeof(int), 1, fp); //读取图像的高度 if (width != 80) { printf("图像宽度必须为80像素\n"); exit(0); } fseek(fp, 54, SEEK_SET); //跳过前面14字节文件头和40字节信息头,到达像素数据起始处 blank = fgetc(fp); //我们规定读取第一个字节的数据就是背景色 for (int i = 0; i < height; ++i) { fseek(fp, 54, SEEK_SET); fseek(fp, (height - i - 1) * 3 * 80, SEEK_CUR);//跳过前height-1行的像素数据,因为文件存储时像素是左下角像素先存储,但是我要从左上角开始打印,所以得让文件指针指向对应像素的数据 for (int j = 0; j < 80; ++j) //打印一行 { pix = fgetc(fp); if (pix == blank) { printf(" "); //如果像素为背景色,则画出一个空格 } else { printf("."); //反之画出一个. } //注意,我们读完一个像素的一个字节数据后,还要跳过2个字节 fseek(fp, sizeof(char) * 2, SEEK_CUR); } printf("\n"); //每打印完一行就换行 } fclose(fp); system("pause"); return 0; } 原80* 25 BMP图片:

打印图片效果:

标签:

本文共计1136个文字,预计阅读时间需要5分钟。

如何用C语言从80*25分辨率BMP图片中提取文字图像并转换为字符点阵显示?

使用C语言编程读取80%*25分辨率的BMP图像中的文字图像,以字符点阵的形式显示。在编写此程序之前,需要了解一些BMP位图文件的基本知识:

1. 24位BMP文件基本结构:14字节文件头(包括文件类型、文件大小、保留字段、偏移量等)。

用c语言编程读取80*25分辨率的BMP图片中的文字图像以字符点阵的形式显示。

写这个程序之前得了解一下BMP位图文件的一些基础知识

前提知识: 一、24位BMP(bitmap)文件基本结构: 14字节文件头 + 40字节信息头 + 位图像素数据(一个像素3个字节:蓝色分量(1字节)、绿色分量(1字节)、红色分量(1字节))。

注意:存储位图像素数据时是从左下角像素开始,从左到右,从下到上,直至最右上的那个像素。

14字节文件头:

​ 位图标志(BM: 2字节)、文件大小(4字节)、保留字节(保留4个字节,值为0)、第一个图像像素信息距离文件头的偏移植(4字节)。

40字节信息头:

​ 信息头长度(4字节,一般值是40,即信息头长40字节)、图像的宽度(4字节,单位像素)、图像的高度(4字节,单位像素)、

​ 目标设备颜色平面数(2字节,固定设置为2字节,固定设置值为1)、每像素所占的比特位数(2字节)、

​ 图像数据压缩的类型(4字节,24位颜色值的位图一般该值为0,表示不压缩)、

如何用C语言从80*25分辨率BMP图片中提取文字图像并转换为字符点阵显示?

​ 图像所有像素占的字节数(4字节,一般为宽度 * 高度 * 每个像素所占的颜色字节数)、

​ 水平分辨率(4字节,用像素/米表示,一般为0缺省)、垂直分辨率(4字节,用像素/米表示,一般为0缺省)、

​ 颜色表中的颜色索引数(4字节,如果没用一般为0)、对图像显示有重要影响的颜色索引数(4字节,如果没用一般为0)。

位图像素数据(24位位图):由左下角像素开始,由左向右,由下向上,到最右上角的像素。

左下角最后一行第一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

左下角最后一行第二个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

. . . . . .

左下角最后一行最后一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

. . . . . .

左上角第一行第一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)、

. . . . . .

右上角第一行最后一个像素(3个字节:蓝色分量1字节、绿色分量1字节、红色分量1字节)。

注意:位图数据中每个扫描行的字节数必须是4的倍数。如果不足要用0补齐。

程序实现:

使用到了命令行参数

int main(int argc,char* argv[]) { /* 用c语言读取80*25点阵的24位的BMP位图然后在字符模式下显示*/ FILE* fp; //指向图像文件的文件指针 int width, height; //图像的宽度和高度(单位像素) char pix, blank; //pix:存放读取的像素分量数据, //blank:存放图片的背景颜色(第一个读取出来的值作为背景,以后不是背景色的像素我们都画出来) if (argc != 2) { printf("传入参数个数错误"); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("%s图像文件不存在!\n",argv[1]); exit(0); } fseek(fp, 18, SEEK_SET);//将文件读写指针移动到文件头偏移为18字节处 fread(&width, sizeof(int), 1, fp); //读取图像的宽度 fread(&height, sizeof(int), 1, fp); //读取图像的高度 if (width != 80) { printf("图像宽度必须为80像素\n"); exit(0); } fseek(fp, 54, SEEK_SET); //跳过前面14字节文件头和40字节信息头,到达像素数据起始处 blank = fgetc(fp); //我们规定读取第一个字节的数据就是背景色 for (int i = 0; i < height; ++i) { fseek(fp, 54, SEEK_SET); fseek(fp, (height - i - 1) * 3 * 80, SEEK_CUR);//跳过前height-1行的像素数据,因为文件存储时像素是左下角像素先存储,但是我要从左上角开始打印,所以得让文件指针指向对应像素的数据 for (int j = 0; j < 80; ++j) //打印一行 { pix = fgetc(fp); if (pix == blank) { printf(" "); //如果像素为背景色,则画出一个空格 } else { printf("."); //反之画出一个. } //注意,我们读完一个像素的一个字节数据后,还要跳过2个字节 fseek(fp, sizeof(char) * 2, SEEK_CUR); } printf("\n"); //每打印完一行就换行 } fclose(fp); system("pause"); return 0; } 原80* 25 BMP图片:

打印图片效果:

标签: