读/写简单 BMP 图像 C++

2024-03-24

我正在尝试读取简单的 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

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

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

to this:

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 行数据读入数组,可能会覆盖数组的末尾。一旦你浏览了图像的一半以上,考虑到你的输出,这很有趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读/写简单 BMP 图像 C++ 的相关文章

随机推荐

  • 是否可以使用flyway管理oracle数据库?

    我真的很难理解如何使用 Flyway 来管理 Oracle 数据库 相关数据库有 3 个模式 如果我在我的 gradle 文件中的 Flyway 插件定义中规定了 3 个模式 我如何管理用户本身的创建以及他们使用的表空间 任何提示或建议将非
  • Jquery Mobile 面板随内容滚动

    使用 Jquery Mobile 我有一个面板 div 来创建导航系统并将其高度设置为浏览器的 100 如果内容超出面板的高度 则 css Overflow y 属性可让用户滚动查看隐藏的内容 很简单吧 现在我遇到了一些麻烦 虽然 css
  • 如何向节点的所有特定子节点添加属性

    我有以下节点 我想在其中向所有节点添加属性add nodes
  • Flutter Firestore - 查找“文档快照”id

    我有一个带有产品列表的简单应用程序 产品存储在 Firebase Firestore 上 我想下载产品列表并让用户可以更新一些数据 所以我准备了产品清单 Widget buildProductsList return new StreamB
  • JcaPEMWriter 可以生成 PKCS#8 输出吗?

    以下代码使用JcaPEMWriterBouncyCastle 中的类 以 PKCS 1 格式输出随机生成的 RSA 私钥 BEGIN RSA PRIVATE KEY public static void main String args t
  • Kotlin for 具有不同的增量

    Kotlin 有以下内容 for i in 0 10 它与Java类似 for int i 0 i lt 10 i 但是如何改变 kotlin 中的增量以获得与 java 中类似的东西 for int i 0 i lt 10 i i 2 f
  • TYPO3-Slug 无法使用 f:link.action 中的多个参数

    我尝试在 TYPO3 9 5 中从操作链接创建语音 URL 以便让下一页知道用户来自哪里 当我使用此代码作为操作链接时
  • 更改 android 字体不起作用

    我正在使用以下代码行来更改字体类型android应用 L Typeface font Typeface createFromAsset this getAssets fonts Abumohammed ttf textView setTyp
  • 为什么泛型类中重复嵌套类型的字段声明会导致源代码大幅增加?

    场景非常罕见 但非常简单 定义一个泛型类 然后创建一个继承自外部类的嵌套类 并在嵌套内定义一个关联字段 自类型 代码片段比描述更简单 class Outer
  • WCF 中是否可以有可选的 DataMember?

    如果我有以下课程 DataContract public class GetColorsRS DataMember Name Colors Order 0 IsRequired true public List
  • 我是否仍然需要对 CSS box-shadow 属性使用所有五个供应商前缀?

    声明时说box shadow or text shadow或者梯度 你还需要所有的前缀吗 webkit box shadow inset 0 0 1px 1px e3e3e3 moz box shadow inset 0 0 1px 1px
  • Jetpack Compose Constraint 布局约束不链接

    我将 constrainAs 与 Jetpack Compose 结合使用 将 wifi 选项列表限制到父级的顶部 然后限制到文本视图的底部 从照片中可以看出 我的列表并没有被限制在父级的顶部或其下面的文本视图上 它甚至被向上推离屏幕 作为
  • Actions on Google 上的帐户取消关联

    我正在 Google 上开发一项操作 要求用户使用我的服务登录 我以前可以实施帐户关联 https developers google com actions develop identity account linking 效果很好 我能
  • UDAF 与 Spark 中聚合器的性能比较

    我正在尝试在 Spark 中编写一些注重性能的代码 并想知道是否应该编写一个聚合器 https spark apache org docs latest api java org apache spark Aggregator html o
  • Haskell:代数数据与元组

    data Ray Ray Vector Vector or type Ray Vector Vector 在惯用的 Haskell 中哪个是首选 为什么我应该使用其中一种而不是另一种 我不关心表现 它似乎与功能没有什么区别 例如 trace
  • 使用 jax-rs 从 REST 服务下载 xml,无需本地存储文件

    在一项服务中 我正在创建一个名为 doc 的 XML 文档 并且希望用户收到下载该文档的提示 而不必将其保存在本地 如显示打开或保存文件的提示 但是 我无法找到应该如何构建将返回的响应 甚至无法找到 Produce 的类型 到目前为止我有这
  • 在 TCSH Shell 中启用历史记录

    如何启用在 tcsh shell 中输入的所有命令的日志记录 我试过了 将 history 变量设置为 100 savehist 到 99 将 histfile 设置为 home history 在 shell 中键入命令不会将命令保存在历
  • 让 gcc 警告隐式转换[重复]

    这个问题在这里已经有答案了 可能的重复 我可以让 GCC 在将太宽的类型传递给函数时发出警告吗 https stackoverflow com questions 310108 can i make gcc warn on passing
  • 从 Java (Scala) 调用 PHP 代码并获取结果

    这似乎在几个地方被问到 并被标记为 关闭 和 偏离主题 然而 人们似乎不断遇到这个问题 从java调用php方法 https stackoverflow com questions 614894 invoking a php method
  • 读/写简单 BMP 图像 C++

    我正在尝试读取简单的 BMP 文件 并且在不执行任何操作的情况下将其再次写回文件 我不知道读取文件或写回文件时出错在哪里 我在阅读和写作时添加了填充 文件读取 std vector