我正在尝试使用 libpng 从 Qt 资源中读取 png。问题:进行读取的类不应该具有 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 无效。我的第一个反应是关于“二进制”。然而:
- istringstream iss(std::stringstream::in | std::stringstream::binary); 感觉不错。
- QIODevice::ReadOnly 似乎没有二进制伙伴。
你看到我错过了什么吗?