【发布时间】:2015-05-06 13:52:59
【问题描述】:
我正在尝试使用 libpng 从 Qt 资源。问题:正在阅读的班级 应该不有任何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 似乎没有二进制伙伴。
你看到我错过了什么吗?
【问题讨论】:
标签: c++ qt qfile istringstream