gpt4 book ai didi

c++ - 读取 BMP 文件返回意外数据

转载 作者:行者123 更新时间:2023-11-28 04:54:15 41 4
gpt4 key购买 nike

我用以下第一行制作了位图:0000000000000000000000000000000111111111(这是位图边缘的黑线)但是当我读取位图时,我在第一行得到了以下数据:1000100100001001000010010000100100001001

实际上前 3 行包含 1 和一些零。其余值为 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;
}

有人了解这种行为吗?提前致谢。

最佳答案

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

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

另请注意,对于 R=G=B=0(即黑色),您输出 1,否则输出 0。您的意图可能恰恰相反。

你还应该在最后添加一个delete [] data;

总结:您的代码仅适用于 biHeight > 0 和 (3 * biWidth) % 4 == 0 的 RGB24 图像,您必须知道您正在从底行输出到顶行,R=G 为 1 =B=0 否则为 0。

关于c++ - 读取 BMP 文件返回意外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47534243/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com