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

C++语言编程读取24位*.bmp格式位图图像,并显示对应图像的ASCII字符图。


#include 
#include 

#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;j1);   //跳过扫描时每行填充的字符,fp_width表示每行计算机需要填充的字符数

    }

    for( i=0;ifor( j=0;jif(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码字符图
24位BMP位图转换成ASCII码字符图_第1张图片


关于BMP位图的内容可以访问博客:BMP格式详解

你可能感兴趣的:(24位BMP位图转换成ASCII码字符图)