读取BMP文件会返回意外数据

时间:2017-11-28 14:41:37

标签: c++ bitmap

我使用以下第一行创建了一个位图: 0000000000000000000000000000000111111111 (这是位图边缘的黑线) 但是当我读取位图时,我会在第一行返回以下数据: 1000100100001001000010010000100100001001

实际上前3行包含1和0。其余值为0。 我使用以下代码:

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

int main() {
    FILE* f = fopen("C:\\Users\\Laptop_Chris\\Documents\\kleinObject.bmp", "rb");
    unsigned char info[54];
    fread(info, sizeof(unsigned char), 54, f);

    int size = ((*(int*)&info[18] * 3 + 3) & (~3)) * *(int*)&info[22]; //BMP - HEIGHT: *(int*)&info[22]  -  WIDTH:*(int*)&info[18]

    unsigned char* data = new unsigned char[size];
    fread(data, sizeof(unsigned char), size, f);
    fclose(f);

    vector< vector<bool> > myVector;
    myVector.resize(*(int*)&info[22], vector<bool>(*(int*)&info[18]));

    int i = 0;

    for (auto a = 0; a < *(int*)&info[22]; a++) {
        for (auto q = 0; q < *(int*)&info[18]; q++) {
            if ((int(data[i] & 0xFF) + int(data[i + 1] & 0xFF) + int(data[i + 2] & 0xFF)) > 0) {
                myVector[a][q] = false;
            }
            else {
                myVector[a][q] = true;
            }
            i = i + 3;
            cout << myVector[a][q];
        }
        cout << endl;
    }
    cin.get();
    return 0;
}

任何理解这种行为的人? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的假设是您有一个RGB24位图和BITMAPINFOHEADER :: biHeight&gt; 0(即你的*(int*)&info[22])。请注意,这意味着您的图像从底行到顶行存储。

此外,您在计算size时处理4字节填充,但在阅读data时您没有处理它。

另请注意,您输出1代表R = G = B = 0(即黑色),否则为0。你可能正好相反。

您还应该在最后添加delete [] data;

摘要:您的代码仅适用于具有biHeight&gt;的RGB24图像。 0和(3 * biWidth)%4 == 0你必须知道你是从底行到顶行输出,1是R = G = B = 0和0输出。