我使用以下第一行创建了一个位图: 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;
}
任何理解这种行为的人? 提前谢谢。
答案 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输出。