C++解析BMP图像控制台绘制

任务:用c++编程语言读取解析示例图片(这里以bmp格式图片为例),并进行显示和输出图片宽度和高度的操作(这里用控制台窗口进行显示)。

图片:

思路:

  1. 把图片以文件形式打开。
  2. 查阅BMP格式,对文件进行解析,读取图片宽、高、像素值等信息。
  3. 文件指针跳转到图像数据起始位置,读取RGB值,并利用SetPixel()函数在控制台绘制图像。

注意:

有的编译环境中调用SetPixel()函数,除了已写的头文件,还需要手动包含静态库。如cmd编译时用指令

g++ bmpshow.cpp -o bmpshow.exe -lgdi32 -std=c++17

(其中“bmpshow.cpp”为cpp文件名)

代码:

#include<Windows.h>

#include<mbstring.h>

#include<malloc.h>

#include<stdlib.h>

#include<stdio.h>

#include<iostream>

using namespace std;



int main()

{

    char ImageName[30]="image.bmp";                       //定义打开图像名字

    FILE* fp;                                 //定义图片件指针

    char* buf;                                //定义文件读取缓冲区

    char *p;                                //实现死循环辅助指针



    int r, g, b;                            //RGB值

    DWORD w, h;                             //定义读取图像的长和宽

    WORD biBitCount;                //说明比特数/像素,其值为1、4、8、16、24、或32

    BITMAPFILEHEADER bf;                      //图像文件头

    UINT bftype;                                //  图像类型

    BITMAPINFOHEADER bi;                      //图像文件头信息



    fp = fopen(ImageName, "rb");    //打开文件(图像和cpp文件在一个目录下)

    if(fp==NULL)

    {

        cout << "Open file ERROR!" << endl;

        exit(0);

    }



    fread(&bf, sizeof(BITMAPFILEHEADER), 1, fp);//读取BMP文件头文件

    bftype = bf.bfType;

    if(bftype!=0x4D42)

    {

        cout << "Image Type Wrong!" << endl;

        exit(0);

    }



    fread(&bi, sizeof(BITMAPINFOHEADER), 1, fp);//读取BMP文件头文件信息

    w = bi.biWidth;                            //获取图像的宽

    h = bi.biHeight;    

 //获取图像的高 如果该值是一个正数说明图像是倒向的,如果该值是一个负数则说明图像是正向的

    biBitCount = bi.biBitCount; //获取图像像素 

    //biBitCount=24 表示位图最多有1670万种颜色。在位数组中,每3个字节代表一个像素,分别对应于颜色R、G、B。

    cout << "Image_Width:" << w << endl;

    cout << "Image_Height:" << h ;

    // cout << biBitCount << endl;

    if(biBitCount!=24)

    {

        cout << "biBitCount is not 24!" << endl;

        exit(0);

    }

    buf = (char*)malloc(w * h * 3); //分配缓冲区大小  在位数组中,每3个字节代表一个像素

    fseek(fp, long(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)), 0);//定位到位图数据像素起始位置

    fread(buf, 1, w * h * 3, fp);                   //开始读取数据



    //绘制图片

    HWND consoleWindow = GetConsoleWindow();     //获取窗口句柄

    HDC consoleDC = GetDC(consoleWindow);

    int x = 0;

    int y = 40;     //w,h,输出让位置

    while (true)        //防止SetPixel()函数绘制像素值后会消失

    {

        p = buf;

        for (DWORD j = 0; j < h; j++)

        {

            for (DWORD i = 0; i < w; i++)

            {

                b = *p++;

                g = *p++;

                r = *p++;

                SetPixel(consoleDC, x + i, y + h - j, RGB(r, g, b));    //  图像倒向

            }

        }

    }

    fclose(fp);

    system("pause");

    return 0;

}

运行截图不在这里展示了,有兴趣的朋友可以自己尝试运行~

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值