c++ - 为什么 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);
}
}
解决方案
图像大小只是未压缩的像素数据。如果我们将 2479 四舍五入到最接近的 32 倍数 (2496),我们得到(2496 x 3508) / 8 = 1094496
.
注意,我们除以 8 因为图像是单色的,所以每个像素都是一个位。当然,每个字节有 8 位。
推荐阅读
- azure - Azure 存储 blob - ConditionNotMet
- terraform - Terraform foreach 多个地图变量
- flutter - 如何在颤动中找到两个位置之间的距离和时间计算
- javascript - 如何删除最后选择的值
- adsense - 只有在设置变量或其他情况下,我才能在 Google Ad Manager 上使用 Adsense 后备?
- javascript - 如何根据选定的行值删除其他行?
- marklogic - 添加属性元数据时出现异常
- node.js - 我要如何解决这个错误我快疯了
- javascript - Js:更改输入字段值的正确方法
- json - 在 Flutter 中解析 JSON 文件时出现空错误