【问题标题】:Read and write image data C++读取和写入图像数据 C++
【发布时间】:2013-01-11 18:04:36
【问题描述】:

我刚刚开始学习 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格式的。

【问题讨论】:

标签: c++ image file


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您显然在使用 MS Windows:Windows 通过对行分隔符的不同处理来区分“文本”和“二进制”文件。对于二进制文件,您不希望它在读取时将\n\r 转换为\n。为防止出现这种情况,请在打开文件时使用 ios::binary 模式,如@Emil tells you

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

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

    这甚至在二战中使用 MS-DOS 也有效。

    【讨论】:

    • 是的!感谢您提供有关仅使用 / 而不是 \\ 的提示,它正在工作! :)
    【解决方案3】:

    如果目标只是复制一个文件,那么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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多