gpt4 book ai didi

c++ - 使用 QFile 使 istringstream 作为二进制输入(对于 libpng)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:27 25 4
gpt4 key购买 nike

我正在尝试使用 libpng 从中读取 pngQt 资源。问题:正在阅读的类(class)不应该对 Qt 有任何依赖。

第一步,阅读http://www.piko3d.net/tutorials/libpng-tutorial-loading-png-files-from-streams/#CustomRead我已经成功地写了一个函数

read_png(istream& in)

我也成功地传递了一个普通的旧 ifstream

ifstream in("abs_path_to_png/icon.png");

read_png(..) 并让它成功读取 png。但是如何获得来自 Qt 资源的(最好是独立于平台的)istream?表现不是什么大问题,所以我最初想到了

bool Io_Qt::get_istringstream_from_QFile(QFile& qfile, istringstream& iss)
{
// [.. Some checking for existence and the file being open ..]
QString qs(qfile.readAll());
iss.str(qs.toStdString());

// I also tried: QByteArray arr(qfile.readAll()); iss.str(arr.data());

return qfile.isOpen();
}

// Someplace else iss and qfile are created like this:

istringstream iss(std::stringstream::in | std::stringstream::binary);
QFile qfile(":/res/icon.png");
qfile.open(QIODevice::ReadOnly);

这实际上产生了一个问题,乍一看,看起来不错,当说

cout << "'" << iss.str().c_str() << "'" << endl;

我明白了

'�PNG

'

虽然似乎存在一些空白问题。对于

ifstream in("abs_path_to_png/icon.png");
char c;
cout << "'";
for (int j=0;j<8;j++)
{
in >> c;
cout << c;
}
cout << "'" << endl;

产量

'�PNG'

虽然后者有效,但前者变体最终导致 libpng 检查函数 png_sig_cmp(..) 将我的 png 视为无效而拒绝。我的第一 react 是关于“二进制”。然而:

  1. istringstream iss(std::stringstream::in | std::stringstream::binary);感觉不错。
  2. QIODevice::ReadOnly 似乎没有二进制伙伴。

你看到我错过了什么吗?

最佳答案

您正在处理流,就像处理带有词法提取运算符的文本数据一样。查看ios::binary以及 readwrite适用于二进制流的方法。

我会放弃 operator<<operator>>在你的情况下完全支持readwrite .使用 ostream::write写入从 QIODevice::readAll() 返回的字节数组数据将其内容传输到您的临时字符串流,例如,并使用 ostream::read在您的测试中验证其内容。

确保您正确传输的一个很好的测试用例是编写一个测试,其中您从 QFile 中读取内容,使用 ostream::write将其传输到二进制输出文件流(ofstream),然后尝试将其加载到图像软件中以查看是否可以。然后将您的文件流与字符串流交换并将其传递给 libpng当你有那个工作时。

关于c++ - 使用 QFile 使 istringstream 作为二进制输入(对于 libpng),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com