作者liu2007 (薯)
看板C_and_CPP
标题[问题] QMovie 不吃 QZipReader 的fileData
时间Thu Feb 25 01:43:01 2021
我的开发平台是 win7
工具是QT Creator
版本是Qt Core 5.15.2
我采用内建的 QZipReader (#include "private/qzipreader_p.h")
来读取zip压缩档内的单一档案,然後显示
当读取压缩档内的bmp, png, jpg时
我用QImage来读取图片可成功读取
mPath = "F:/image/myzip.zip";
path = "myzip.zip/01.jpg";
mZipReader = new QZipReader(mPath);
QByteArray data{mZipReader->fileData(path)};
bool isSuccessed = image.loadFromData(data,"JPG");
但是如果要读取的档案是GIF档
则无论用QImageReader 或是 QMovie 都无法成功读取
mPath = "F:/image/myzip.zip";
path = "myzip.zip/1445806472.gif";
mZipReader = new QZipReader(mPath);
QByteArray data{mZipReader->fileData(path)};
QMovie *movie = new QMovie(data, "GIF");
qDebug() << movie->isValid(); //false
qDebug() << movie->lastErrorString(); //"File not found"
qDebug() << movie->fileName(); // "GIF89a\u0016\u0002B\u0001?"
想请问除了换用其他的lib之外,还有其他读取压缩档内gif可行的办法吗?
感谢阅读
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.225.144 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1614188583.A.0E9.html
1F:推 john790710: QMovie是要给IODevice 02/25 09:40
感谢大大的回覆
不过我发现使用QBuffer会产生Runtime的问题
https://imgur.com/P2ZV6SY
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "private/qzipreader_p.h"
#include <QBuffer>
#include <QMovie>
#include <QLabel>
#include<QByteArray>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QZipReader *zip = new QZipReader("MMM.zip");
QByteArray ba{zip->fileData("1445806472.gif")};
QBuffer buff;
buff.setData(ba);
if(buff.open(QIODevice::ReadOnly))
qDebug() << "yes" ;
QMovie *movie = new QMovie(&buff,"GIF");
ui->label->setMovie(movie);
movie->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
qDebug() << "movie->fileName(): " << movie->fileName() ;
//ok, 但是是空字串: ""
qDebug() << "movie->isValid(): " << movie->isValid() ;
//如果呼叫 movie->start() 为true
//如未呼叫 movie->start() 会crash
qDebug() << "movie->cacheMode(): " << movie->cacheMode();
//ok, QMovie::CacheNone
qDebug() << "movie->currentFrameNumber(): " << movie->currentFrameNumber();
//ok, 0
qDebug() << "movie->device(): " << movie->device();
//ok, QObject(0x22ac50)
qDebug() << "movie->format(): " << movie->format();
//ok, "GIF"
qDebug() << "movie: " << movie->frameCount();
//crash
qDebug() << "movie->loopCount(): " << movie->loopCount();
//crash
qDebug() << "movie->nextFrameDelay(): " << movie->nextFrameDelay();
//crash
这是我测试的一个专案
QMoive基本上可以读gif的第一张图,然後程式就会crash
专案
https://mega.nz/file/B4lXXQJC#1oNPtQE8yAminrXsMfby1tBzMyQW8eka_aGUOhiMkp4
测试档案
https://mega.nz/file/V00hUQpa#MzBDmO0nEtJ_JyuwCb78tpc0JXjlLbMOMTfAl1q3t3s
3F:→ nh60211as: 还有你的path是不是错了,我用Qt 5.15.1要打"01.jpg" 02/25 10:08
4F:→ nh60211as: 才能读档,不是"myzip.zip/01.jpg",不过有可能是行为 02/25 10:09
5F:→ nh60211as: 变更 02/25 10:09
我是用QZipReader本身的api 来撷取zip档内的file path的
foreach(QZipReader::FileInfo item, mZipReader->fileInfoList()){
if (item.isFile){
if (item.filePath.endsWith("jpg", Qt::CaseInsensitive) ||
item.filePath.endsWith("png", Qt::CaseInsensitive) ||
item.filePath.endsWith("gif", Qt::CaseInsensitive) ||
item.filePath.endsWith("bmp", Qt::CaseInsensitive))
mInfoList.enqueue(item.filePath); //QQueue<QString>
}
}
※ 编辑: liu2007 (123.192.225.144 台湾), 02/25/2021 15:46:27
※ 编辑: liu2007 (123.192.225.144 台湾), 02/25/2021 15:47:14
※ 编辑: liu2007 (123.192.225.144 台湾), 02/25/2021 15:51:37
※ 编辑: liu2007 (123.192.225.144 台湾), 02/25/2021 16:19:04
6F:推 pinefruit: 看了你的程式码,问题出在 QByteArray 和 QBuffer 物件 02/25 16:24
7F:→ pinefruit: 都是区域变数,当建构式一结束这两个物件就销毁了。 02/25 16:24
8F:→ pinefruit: 所以 movie->start() 才会 crash。 02/25 16:25
9F:→ pinefruit: 在 movie 播放 GIF 期间,这两个物件都必须活着才行。 02/25 16:25
没想到我犯了这种错误.....
感谢P大提点
※ 编辑: liu2007 (123.192.225.144 台湾), 02/25/2021 22:41:31