首页 > 如何用C++进行位图RGB读写操作

如何用C++进行位图RGB读写操作

我想通过C语言打开指定位图的RGB值信息,类似Matlab中imread函数功能.由于无法将像素一一映射成控制台字符按原图显示,我通过重写该图看是否与原图一致验证读位图操作是否成功.结果写出来的位图无法打开.我对比了一下,占用存储空间也比原文件小一点,我猜测是自己对此类型图片的存储结构不了解导致的错误.以下是读写位图操作的代码,请各位指点:

#include<stdlib.h>
#include<iostream>
#include<windows.h> 
//文件路径 
#define READPATH "c:\\Users\\asus\\Desktop\\000.bmp"
#define WRITEPATH "c:\\Users\\asus\\Desktop\\0.bmp"
//位图宽和高 
#define W 72
#define H 1980

using namespace std;

int main()
{
    BITMAPFILEHEADER bitFile;
    BITMAPINFOHEADER bitInfo;
    RGBQUAD rgbQuad;
    BYTE b[W][H];
    FILE *fp;
//读文件 
    if(!(fp = fopen(READPATH, "r")))
    {
        printf("Error1!");
        exit(0);
    }
//读文件头 
    if(!(fread(&bitFile, sizeof(bitFile), 1, fp) && fread(&bitInfo, sizeof(bitInfo), 1, fp) && fread(&rgbQuad, sizeof(rgbQuad), 1, fp)))
    {
        fclose(fp);
        printf("Error2!");
        exit(0);
    }
//读数据 
    if(!(fread(&b, sizeof(BYTE), W * H, fp)))
    {
        fclose(fp);
        printf("Error3!");
        exit(0);
    }
    fclose(fp);
//写文件 
    if(!(fp = fopen(WRITEPATH, "w+")))
    {
        printf("Error4!");
        exit(0);
    }
    if(!(fwrite(&bitFile, sizeof(bitFile), 1, fp) && fwrite(&bitInfo, sizeof(bitInfo), 1, fp) && fwrite(&rgbQuad, sizeof(rgbQuad), 1, fp)))
    {
        fclose(fp);
        printf("Error5!");
        exit(0);
    }
    if(!(fwrite(&b, sizeof(BYTE), W * H, fp)))
    {
        fclose(fp);
        printf("Error6!");
        exit(0);
    }
    fclose(fp);
    cout<<endl<<"Succeed!"<<endl;
    return 0;
}

//经回答的朋友提醒我补充一下,以上代码是针对我测试用的8位位图的,不具有普适性.


之前用C写过一个
https://github.com/luckyScrip...
可以维基百科查一下这个格式的二进制存了哪些东西~


代码还没仔细看过,先留个坑再说。。。

先说说一眼看下去的结果,看到一句fwrite(&b, sizeof(BYTE), W * H, fp),题主的bmp是256色的么,如果是24位的应该是W*H*3才对。另外,bmp格式的位图文件中存在align,故数据块的大小不应该通过W*H*(位深度/3),而是通过读取文件头中的信息得到

【热门文章】
【热门文章】