读写图像数据C ++

时间:2013-01-11 18:04:37

标签: c++ image file

我刚刚开始学习C ++,我正在开发一个程序,它应该从硬盘中获取图像,然后将其保存为另一个名称。原始图像仍应保留。我已经使用了文本文件,因为我可以这样做:

ifstream fin("C:\\test.txt");
ofstream fout("C:\\new.txt");

char ch;
while(!fin.eof())
{
    fin.get(ch);
    fout.put(ch);
}

fin.close();
fout.close();
}

但我想这与图像不一样。我是否必须安装lib或类似的东西才能使它工作?或者我可以“只”使用附带的库?我知道我不是C ++的专家所以请告诉我,如果我完全错了。

我希望有人可以并且想帮助我!提前谢谢!

顺便说一句,图像是.png格式。

3 个答案:

答案 0 :(得分:6)

您可以使用std流,但在打开流时使用ios :: binary参数。它有详细记录,互联网上有几个例子

答案 1 :(得分:2)

您显然正在使用MS Windows:Windows通过不同的行分隔符处理来区分“文本”和“二进制”文件。对于二进制文件,您不希望它在阅读时将\n\r翻译为\n。为了防止它,在打开文件时使用ios :: binary模式,为@Emil tells you

顺便说一下,您不必在Windows下的路径中使用\\。只需使用正斜杠:

ifstream fin("C:/test.txt");

使用MS-DOS甚至可以在第二次世界大战中使用。

答案 2 :(得分:0)

如果目标仅仅是复制文件,那么CopyFile可能是比手动操作更好的选择。

#include <Windows.h>
// ...
BOOL const copySuccess = CopyFile("source.png", "dest.png", failIfExists);
// TODO: handle errors.

如果使用Windows API不是一个选项,那么像您一样一次复制一个文件的文件是非常低效的方法。正如其他人所说,你需要打开文件作为二进制文件,以避免I / O搞乱行结尾。这种方式比一次一个char更简单,更有效:

#include <fstream>
// ...
std::ifstream fin("source.png", std::ios::binary);
std::ofstream fout("dest.png", std::ios::binary);
// TODO: handle errors.
fout << fin.rdbuf();