加载和保存后的位图 curropts
Bitmap curropts after being loaded and saved
我将一个 24 位未压缩的位图加载到 R,G,B 无符号字符的二维数组中,然后再次保存它,我使用二进制模式的文件流以确保不会发生自动格式化,并且 header 导出时与整个导入时一样...不需要填充,因为我使用的图像宽度是 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;
}
提前致谢。
您遇到的问题不是未初始化的值,而是 >>
运算符的工作方式;它 skips whitespace 在阅读之前(即使在 ios::binary
模式下)。因此,每当它到达空白字符(0x0A
、0x0D
等)时,它就会跳过它,从而破坏您的输出。
您可以通过在处理文件之前添加 f >> noskipws
来解决此问题。
通常您希望使用 read()/write()
(或 get()/put()
用于单个字符)对二进制文件进行操作,而不是使用提取运算符。类似于您处理获取宽度和高度的方式。如果您要执行 file >> someint
那么它会尝试解析数字而不是读取 sizeof(int)
字节。
我将一个 24 位未压缩的位图加载到 R,G,B 无符号字符的二维数组中,然后再次保存它,我使用二进制模式的文件流以确保不会发生自动格式化,并且 header 导出时与整个导入时一样...不需要填充,因为我使用的图像宽度是 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;
}
提前致谢。
您遇到的问题不是未初始化的值,而是 >>
运算符的工作方式;它 skips whitespace 在阅读之前(即使在 ios::binary
模式下)。因此,每当它到达空白字符(0x0A
、0x0D
等)时,它就会跳过它,从而破坏您的输出。
您可以通过在处理文件之前添加 f >> noskipws
来解决此问题。
通常您希望使用 read()/write()
(或 get()/put()
用于单个字符)对二进制文件进行操作,而不是使用提取运算符。类似于您处理获取宽度和高度的方式。如果您要执行 file >> someint
那么它会尝试解析数字而不是读取 sizeof(int)
字节。