读写图像数据 C++

3

我刚开始学习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();
}

但是我认为对于图片来说不是这样的。我需要安装库或者类似的东西才能使其工作吗?还是“只是”使用已包含的库就可以了?我知道我并不是C++方面的专家,所以请告诉我是否完全错误。
我希望有人能够和愿意帮助我!提前感谢!
顺便说一下,这个图片是.png格式的。

http://stackoverflow.com/q/4237405/1952879 - hmatar
“while (!fin.eof())”是错误的。打哈欠 - Lightness Races in Orbit
但我想这在图像方面并非如此。为什么呢?因为所有文件都只是字节。 - Lightness Races in Orbit
3个回答

7
你可以使用标准流,但在打开流时请使用ios::binary参数。这已经有很好的文档记录,并且网络上有多个实例。

2
您似乎正在使用 MS Windows 操作系统:Windows 通过不同的换行符处理来区分“文本”和“二进制”文件。对于二进制文件,在读取时您不希望将 \n\r 转换为 \n。为了避免这种情况,您需要在打开文件时使用 ios::binary 模式,就像@Emil 告诉您的那样
顺便说一下,在 Windows 下的路径中,您不必使用 \\,可以直接使用正斜杠(/)。
ifstream fin("C:/test.txt");

这在二战时期使用 MS-DOS 就已经可行了。

耶!谢谢你提醒我只需要使用 / 而不是 \,现在可以正常工作了! :) - GuiceU

0

如果目标只是复制文件,那么使用CopyFile可能比手动复制更好。

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

如果不能使用Windows API,则像您所做的一样逐个字符地复制文件是非常低效的方法。正如其他人所指出的那样,您需要将文件以二进制打开,以避免I/O与行结尾混淆。比逐个字符更简单和高效的方法是:
#include <fstream>
// ...
std::ifstream fin("source.png", std::ios::binary);
std::ofstream fout("dest.png", std::ios::binary);
// TODO: handle errors.
fout << fin.rdbuf();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接