首页 > 解决方案 > 为什么 QFile::size() 不近似等于 QImage::sizeInBytes()?

问题描述

我有一个图像文件,Windows 将其标记为 40KB 大。我想将此图像转换为 PDF,但在使用 QPdfWriter 和 QPainter 后,我最终得到了一个 600KB 的 PDF 文件。我检查了有关图像的一些信息:

File size (QFile::size()): 40528
Img size (QImage::size()): QSize(2479, 3508)
Img size in bytes (QImage::sizeInBytes()): 1094496
Image format (QImage::format()): QImage::Format_Mono
Image depth (QImage::depth()): 1

为什么文件大小与图像大小有很大不同?输出的 PDF 文件不应该占用与源图像一样多的空间吗?我可以使用压缩或其他格式使图像更小吗?在将图像文件加载到 QImage 对象期间似乎发生了一些事情。我怎样才能防止这种情况?我尝试使用 QImage::save() 将文件保存为 png 并成功将其保存为 35KB 文件。这意味着问题在于将图像写入 PDF。

void Project::convertImgToPdf()
{
    unsigned int i;
    QString path = projectPath + "/" + projectName + "/output/";
    QDir dir(path + "/img");
    const QString fileName(path + "out.pdf");
    const QPoint imageCoordinates(0,0);
    QPdfWriter pdfWriter(fileName);
    pdfWriter.setResolution(300);
    pdfWriter.setPageSize(QPageSize(QPageSize::A4));
    QPainter painter(&pdfWriter);

    for(i=0;i<dir.count()-2;i++) {
        QImage image(path + "img/img" + QString::number(i));
        if(i>0) {
            pdfWriter.newPage();
        }
        painter.drawImage(imageCoordinates, image);
    }
}

标签: c++qt

解决方案


图像大小只是未压缩的像素数据。如果我们将 2479 四舍五入到最接近的 32 倍数 (2496),我们得到(2496 x 3508) / 8 = 1094496.

注意,我们除以 8 因为图像是单色的,所以每个像素都是一个位。当然,每个字节有 8 位。


推荐阅读