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

查看:580
本文介绍了如何用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位位图的,不具有普适性.

解决方案

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

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

这篇关于如何用C++进行位图RGB读写操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆