您的位置:首页 > 编程语言 > C语言/C++

24位BMP位图转换成ASCII码字符图

2017-04-18 18:31 225 查看
C++语言编程读取24位*.bmp格式位图图像,并显示对应图像的ASCII字符图。

#include <stdio.h>
#include <stdlib.h>

#pragma pack(2)

typedef unsigned short WORD;/*定义WORD为两个字节的类型*/
typedef unsigned long DWORD;/*定义DWORD为e四个字节的类型*/

/*位图文件头*/
typedef struct BMP_FILE_HEADER
{
WORD bType; /* 文件标识符*/
DWORD bSize; /* 文件的大小*/
WORD bReserved1; /* 保留值,必须设置为*/
WORD bReserved2; /* 保留值,必须设置为*/
DWORD bOffset; /* 文件头的最后到图像数据位开始的偏移量*/
} BMPFILEHEADER;

/*位图信息头*/
typedef struct BMP_INFO
{
DWORD bInfoSize; /* 信息头的大小*/
DWORD bWidth; /* 图像的宽度*/
DWORD bHeight; /* 图像的高度*/
WORD bPlanes; /* 图像的位面数*/
WORD bBitCount; /* 每个像素的位数*/
DWORD bCompression; /* 压缩类型*/
DWORD bmpImageSize; /* 图像的大小,以字节为单位*/
DWORD bXPelsPerMeter; /* 水平分辨率*/
DWORD bYPelsPerMeter; /* 垂直分辨率*/
DWORD bClrUsed; /* 使用的色彩数*/
DWORD bClrImportant; /* 重要的颜色数*/
} BMPINF;

/*彩色表*/
typedef struct RGB_QUAD
{
WORD rgbBlue; /* 蓝色强度*/
WORD rgbGreen; /* 绿色强度*/
WORD rgbRed; /* 红色强度*/
WORD rgbReversed; /* 保留值*/
} RGBQUAD;

int main()
{
FILE *fp;
BMPFILEHEADER fileHeader;
BMPINF infoHeader;
long offset, bmpImageSize, width, height, bytesPerPixel, size, bitCount;

WORD c;

if((fp = fopen("C:\\music.bmp", "rb")) == NULL)      //图片路径可修改
{
printf("这个文件不存在!\n");
exit(0);
}

fread(&fileHeader, sizeof(fileHeader), 1, fp);
fread(&infoHeader, sizeof(infoHeader), 1, fp);

//计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节
size = fileHeader.bSize;
offset = fileHeader.bOffset;
bmpImageSize = infoHeader.bmpImageSize;
width = infoHeader.bWidth;
height = infoHeader.bHeight;
bitCount = infoHeader.bBitCount;
bytesPerPixel = infoHeader.bBitCount / 8;

//  printf("大小:%d  , 宽:%d 高:%d \n", size, width, height);

c = fgetc(fp);               //输出每个像素点所占字节中的内容
while (!feof(fp))
{
c = fgetc(fp);
}

fseek(fp, offset, SEEK_SET);            //跳过图像信息头部分
int fp_width=0;
int i,j,ascii=22;               //选用的ascii码可修改

int m=width*3%4;                //通过计算得到每行计算机需要填充的字符数
if(m!=0)
{
fp_width=4-m;
}
int red[200][300];             //申请像素数组大小
int green[200][300];
int blue[200][300];

for(i=height-1;i>=0;i--)          //通过遍历给数组存值
{
for(j=0;j<width;j++)
{
red[i][j]=fgetc(fp);
green[i][j]=fgetc(fp);
blue[i][j]=fgetc(fp);
}
fseek(fp,fp_width,1);   //跳过扫描时每行填充的字符,fp_width表示每行计算机需要填充的字符数

}

for( i=0;i<height;i++)
{
for( j=0;j<width;j++)
{
if(red[i][j]==0&&green[i][j]==0&&blue[i][j]==0)
{
printf(" %c",ascii);
}else if(red[i][j]==255&&green[i][j]==255&&blue[i][j]==255)
{
printf("  ");         //加空格图片显示得更有比例,但可能CMD 显示不全
}
}
printf("\n");
}
fclose(fp);
return 0;
}


示例图片



ASCII码字符图



关于BMP位图的内容可以访问博客:BMP格式详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 位图 ascii