【问题标题】:Bitmap curropts after being loaded and saved加载和保存后的位图 curropts
【发布时间】:2016-12-28 00:38:29
【问题描述】:

我将 24 位未压缩位图加载到 R、G、B 无符号字符的 2D 数组中,然后再次保存,我使用二进制模式的文件流以确保不会发生自动格式化,并且只导出标题作为整体导入...不需要填充,因为我使用宽度为 4 的倍数的图像。

但输出有附加问题,某种...变形

注意:我在二进制模式下尝试了 FILE 和 fstream,都给出了输出 另一件事是,在使用十六进制编辑器检查输出时,我发现它有一个非常重复的“CD”值,这似乎是某种损坏。

更新:源代码:

#include <fstream>
#include <iostream>
#pragma pack(2)
using namespace std;
struct RGB
{
    unsigned char R,G,B;
};

int main()
{
    ifstream f("Picture.bmp",ios::in|ios::binary);
    unsigned char Header[54];
    f.read(reinterpret_cast <char*> (Header),54);
    int W=*(int*) (&Header[18]);
    int H=*(int*) (&Header[22]);

    RGB**Pic=new RGB*[H];
    for (int i=0;i < H;i++)
    {
        Pic[i]=new RGB[W];
        for (int i2=0;i2<W;i2++)
        {
            f>>Pic[i][i2].R;
            f>>Pic[i][i2].B;
            f>>Pic[i][i2].G;
        }
    }
    ofstream save("Output.bmp",ios::out|ios::binary);
    save.write(reinterpret_cast<char*>(&Header),54);
    for (int i=0;i < H;i++)
    {
        for (int i2=0;i2<W;i2++)
        {
            save<<Pic[i][i2].R;
            save<<Pic[i][i2].B;
            save<<Pic[i][i2].G;
        }
    }
        return 0;
}

提前致谢。

【问题讨论】:

  • 没有代码,任何答案都是猜测。请提供您拥有的代码。作为旁注0xCD 是视觉工作室中未初始化的内存值
  • 我附加了代码,所以它会将未初始化的值扔到流中?

标签: c++ image-processing bitmap filestreams


【解决方案1】:

您遇到的问题不在于未初始化的值,而是&gt;&gt; 运算符的工作方式;在阅读之前skips whitespace(即使在ios::binary 模式下)。因此,只要它到达一个空白字符(0x0A0x0D 等),它就会跳过它,从而破坏你的输出。

您可以通过在处理文件之前添加f &gt;&gt; noskipws 来解决此问题。

通常您希望使用read()/write()(或get()/put() 用于单个字符)对二进制文件进行操作,而不是使用提取运算符。与您处理获取宽度和高度的方式类似。如果您要执行file &gt;&gt; someint,那么它将尝试解析数字而不是读取sizeof(int) 字节。

【讨论】:

  • 感谢陌生人,我为此熬了一夜……谢谢。
  • 很高兴为您提供帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2020-01-07
  • 2018-11-03
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多