Skip to content

增加设置生成的图片大小功能 #89

@Mq-b

Description

@Mq-b

目前的软件仅仅支持设置宽度与高度,单位为像素。

这里有好几个问题:

  1. 这个宽度与高度并不保证图片生成后一定的宽高像素,这仅仅是将其传递给 zxing-cpp,它仅仅作为一个参考值(这涉及到标准条码的比例规则等),在绝大多数时候实际绘制的图片并非我们传入的大小。
  2. 就算 zxing-cpp 真的按照了我们传递的参数设置(几乎不可能),也无法对应实际的物理单位 cm 等,我们需要考虑 PPI。

在数字化图像处理中,图片的显示大小并非仅由像素值(px)决定,而是由像素总量分辨率元数据(DPI/DPM) 共同定义的。其遵循的核心公式如下:

$$\text{物理长度 (cm)} = \frac{\text{像素值 (px)}}{\text{分辨率 (DPI)}} \times 2.54$$

$$\mathit{\mathbf{\color{red}{但是仅仅依靠这个公式还不够}}}$$

1. Word 等软件读取尺寸会偏差

多数办公软件(如 Microsoft Word)在读取不含分辨率信息的图片时,会默认采用系统基准分辨率(通常为 96 DPI)作为分母进行计算。

现象: 若生成一张 $591\text{ px}$ 的图片用于表示 $5\text{ cm}$(基于 $300\text{ DPI}$ 计算),但未写入元数据,Word 会按 $\frac{591}{96} \times 2.54$ 计算,导致最终显示尺寸变为约 $15.6\text{ cm}$,且由于拉伸产生严重模糊。

2. DPM 元数据的必要性

DPM(Dots Per Meter,每米点数) 是存储在图像文件头(Header)中的关键属性。它是软件识别图像“物理密度”的唯一依据。

  • 作用: 通过在图像导出时显式设置 DPM 值,可以强制软件在计算公式时使用正确的分母(如 )。
  • 换算关系: 由于 Qt 及多数公制标准库使用 DPM,需通过下式进行转换:

$$DPM = \frac{DPI}{0.0254}$$


总结来说,完成这个需求首先需要进行像素的公式计算,同时由于 zxing-cpp 并不严格按照我们传递的参数设置宽高,我们还得进行缩放。

然后我们再设置 dpm 写入图片,即可确保正确。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions