使用 QuaZip 提取 .cbz 并在 Qt 中创建 QImages?

Posted

技术标签:

【中文标题】使用 QuaZip 提取 .cbz 并在 Qt 中创建 QImages?【英文标题】:Using QuaZip to extract .cbz and create QImages in Qt? 【发布时间】:2019-02-03 15:20:41 【问题描述】:

我目前正在尝试解压缩 .cbz 文件(基本上是 .zip 文件)并将该 .cbz 文件中包含的所有 .png 图像存储到 std::vector<QImage>

我正在使用 QuaZip 来执行此操作。我在网上查看了一些示例,并尝试使用 QuaZip 类文档实现一些不同的方法。

这是我目前拥有的代码:

// Store all files for later access given the CBZ file
bool CbzReader::loadCbzFile(QString cbzFile) 
    QuaZip zip(cbzFile);
    zip.open(QuaZip::mdUnzip);

    const QStringList fileList = zip.getFileNamesList();
    QStringList allFiles = JlCompress::extractFiles(cbzFile, fileList);

    QImage newImage;
    for(int file = 0; file < fileList.size(); file++) 
        QImageReader reader(allFiles[file]);
        newImage = reader.read();

        if(newImage.isNull()) return false;

        imageList.push_back(newImage); //save image to class variable    
    

    return true;

变量 allFiles 包含 265 个条目,但是,在 for 循环内部,它返回 false,因为 newImage 被 Qt 称为 invalid

我做错了怎么办?我应该在 QuaZip 中使用不同的函数而不是 JlCompress 吗?

【问题讨论】:

也许你的路径是错误的。还要检查您当前的工作目录以获取提取的图像。看看它们是否可以用成像软件读取。 您可以使用QFile::exists(allFiles[file]) 添加快速检查,以确保在尝试读取之前提取的文件确实存在。 @drescherjm .cbz 文件的路径?不,我认为这是正确的。 fileList 列表确实包含原始 .cbz 文件中的文件。但是,.cbz 文件在进一步检查后包含 .jpeg 和 .png 图像的混合。也许这就是问题所在? 我说的是压缩文件里有没有文件夹结构。 @G.M.我试过了,是的,它确实存在。 【参考方案1】:

事实证明,提取 .cbz 文件会导致至少一个不是图像文件的文件,并且试图从中制作 QImage,从而导致错误。我对解压缩文件的内容没有给予足够的关注。

这现在可以工作了,因为我使用布尔表达式来检查未压缩文件的文件扩展名。

所以是啊,我的坏人。

【讨论】:

以上是关于使用 QuaZip 提取 .cbz 并在 Qt 中创建 QImages?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 7 上构建 Quazip 0.5.1?

Qt 4 - QuaZip - 文件大小限制和内存问题

Qt中用QuaZip来压缩和解压缩文件

Qt之zip压缩/解压缩(QuaZIP)

QT QuaZip open() 失败 -1000

Qt 之 ZIP开源库 QuaZIP