Я пытаюсь использовать libpng, чтобы прочитать png от ресурс Qt. Улов: класс, выполняющий чтение , должен не иметь любые зависимости Qt.Использование QFile made istringstream как двоичный вход (для libpng)
На первом этапе, чтение 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. Но как получить a (предпочтительно независимый от платформы) istream из Qt-ресурса? Производительность не является большим вопросом, поэтому я изначально придумал
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);
Это фактически дает ISS, который, на первый взгляд, выглядит хорошо, когда говорят
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, похоже, не имеет двоичного партнера.
Вы видите, что я пропустил?
Я мог ошибаться, но я бы подумал, что нужно двоичный флаг, но 'stringstream :: in' и' stringstream :: out' не обязательно, поскольку это должно быть состояние по умолчанию 'stringstream' (как входной, так и выходной), в отличие от 'istringstream' или' ostringstream'. –
Вот что я думаю. Теперь я также тестировал только двоичный файл. Тем не менее: я видел в результатах, что это как указано в моем сообщении: в обоих случаях оба требуются. Двоичный по какой-то причине нет. Заданный png 32x32, 3 байта на пиксель, цвет 2, handdrawn мной, используя GIMP. Все это происходит на 64-битной машине Debian. –
Это странный вопрос - довольно запутанный для меня и, возможно, специфический для компилятора. О, хорошо, это не помешает указать их! Обычно я нахожу iostreams настолько противоречивым, что я использую их очень косвенно или иногда просто предпочитаю функции C. Это одна из причин, по которой я не мог дать вам идеального ответа, но я рад, что у вас это работает. –