如何用C++进行位图RGB读写操作
怪我咯
怪我咯 2017-04-17 14:22:51
0
2
726

我想通过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位位图的,不具有普适性.

怪我咯
怪我咯

走同样的路,发现不同的人生

全員に返信(2)
伊谢尔伦

まだコードをよく見ていないので、まず穴を開けておきます。 。 。

まず結果をざっとお話しします。 fwrite(&b, sizeof(BYTE), W * H, fp) という文を見たとき、質問の主題の bmp は 24 ビットであれば W*H*3 になるはずです。また、bmp 形式のビットマップ ファイルには align があるため、データ ブロックのサイズは W*H*(位深度/3) を介して渡すのではなく、ファイル ヘッダー

の情報を読み取ることで取得する必要があります。
いいねを押す +0
Ty80

以前 C で書きました
https://github.com/luckyScrip...
この形式のバイナリにどのようなものが格納されているかは Wikipedia で確認できます~

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート