【问题标题】:Read/Write SImple BMP Image C++读/写简单 BMP 图像 C++
【发布时间】:2015-03-12 04:57:18
【问题描述】:

我正在尝试读取简单的 BMP 文件,但不执行任何操作,我将其再次写回文件。

我不知道读取文件或写回文件的错误在哪里。 我在阅读和写作时都添加了填充

-- 文件读取--.

std::vector<char> tempImageData;
/*tempImageData.resize(m_bmpInfo->imagesize);
file.seekg(m_bmpHeader->dataoffset);
file.read(&tempImageData[0], m_bmpInfo->imagesize);
file.close();*/
tempImageData.resize(m_bmpInfo->imagesize);
int padding = 0;
while (((m_bmpInfo->width*3+padding) % 4) != 0 )
    padding++;
for(unsigned int i = 0 ; i < m_bmpInfo->height ; i++)
{
    file.seekg(m_bmpHeader->dataoffset + i*(m_bmpInfo->width*3 + padding));
    file.read(&tempImageData[i*m_bmpInfo->width*3], i*m_bmpInfo->width*3);
}
file.close();
//bitmaps are stored as BGR -- lets convert to RGB
assert(m_bmpInfo->imagesize % 3 == 0);

for (auto i = tempImageData.begin(); i != tempImageData.end(); i+=3)
{
    m_data_red.push_back(*(i+2));
    m_data_green.push_back(*(i+1));
    m_data_blue.push_back(*(i+0));
}

--写代码

file.write(reinterpret_cast<const char*>(m_bmpHeader), sizeof(BITMAPFILEHEADER));
file.write(reinterpret_cast<const char*>(m_bmpInfo), sizeof(BITMAPINFOHEADER));

// this is wrong.. format asks for bgr.. we are putting all r, all g, all b
std::vector<char> img;
img.reserve(m_data_red.size() + m_data_green.size() + m_data_blue.size());

for(unsigned int i = 0 ; i < m_data_red.size() ; i++)
{
    img.push_back(m_data_blue[i]);
    img.push_back(m_data_green[i]);
    img.push_back(m_data_red[i]);
}

char bmppad[3] = {0};

for(unsigned int i = 0 ; i < m_bmpInfo->height ; i++)
{
    // maybe something is wrong
    file.write(reinterpret_cast<const char*>(&img[i*m_bmpInfo->width*3]), m_bmpInfo->width * 3 * sizeof(unsigned char));
    file.write(bmppad, 1 * ((4-(m_bmpInfo->width*3)%4)%4) * sizeof(char));
}

file.close();

但结果很奇怪。

Output image------Input image

【问题讨论】:

  • 您是否以二进制模式打开文件?你漏掉了那个代码。
  • 是的,以二进制模式打开.. 代码太多,我有点难过,我不得不发布这么大的代码,我什至无法确定问题出在哪里跨度>
  • 也许尝试使用无符号字符而不是字符?
  • @1.618,试过了,结果一样;顺便说一句,您的意思是在写入文件时,对吗?
  • sizeof(char) 根据定义始终为 1,因此您可以通过省略它来简化一点。

标签: c++ image image-processing vector bmp


【解决方案1】:

由于每一行都添加了填充,我认为您需要更改这一行:

file.seekg(m_bmpHeader->dataoffset + i*m_bmpInfo->width*3 + padding);

到这里:

file.seekg(m_bmpHeader->dataoffset + i*(m_bmpInfo->width*3 + padding));

保存计算的填充也可能比以两种不同的方式计算更容易。

编辑: 没有全部的代码来调试,有点难以定位,但是这一行有一个错误:

file.read(&tempImageData[i*m_bmpInfo->width*3], i*m_bmpInfo->width*3);

您不应该在您阅读的内容中包含i* 部分。这意味着在第 200 行,您正在将 200 行的数据读取到数组中,可能会覆盖数组的末尾。一旦您通过图像的一半以上,考虑到您的输出,这很有趣。

【讨论】:

  • 感谢您的回答。我还是没弄好,请看我的编辑
  • 查看我的答案中的额外修复,不确定是否有帮助。
  • @user2705939 你最新的编辑仍然没有正确的seekg,你解决了吗?
猜你喜欢
  • 2014-12-26
  • 2016-09-07
  • 2021-04-26
  • 2012-12-14
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
相关资源
最近更新 更多