我想通过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位位图的,不具有普适性.
代码还没仔细看过,先留个坑再说。。。
先说说一眼看下去的结果,看到一句
fwrite(&b, sizeof(BYTE), W * H, fp)
,题主的bmp是256色的么,如果是24位的应该是W*H*3
才对。另外,bmp格式的位图文件中存在align,故数据块的大小不应该通过W*H*(位深度/3)
,而是通过读取文件头中的信息得到之前用C写过一个
https://github.com/luckyScrip...
可以维基百科查一下这个格式的二进制存了哪些东西~