先把最常见的误会拆了

「把 72dpi 改成 300dpi」——听起来像把图变清晰了。但 DPI(dots per inch)不描述图像本身,只描述打印密度:同一个 2480×3508 的 PNG,按 300dpi 打印是 A4 一页,按 72dpi 打印就是 87 厘米宽的海报。像素一个没变,变的只是「每英寸摆几个」的解释。所以「改 DPI」是一个纯元数据操作:改的是文件里一小段声明字段,像素数据原封不动——这也是为什么字节级改写可以在零重编码、零画质损失下完成,重编码才有画质损失,而这里根本不碰像素。

反过来的追问更实际:印刷厂要 300dpi,我的图是 72dpi,改完数字就达标了吗?要看像素总量够不够。300dpi 印 A4(21×29.7cm)需要约 2480×3508 像素;一张 600×848 的图改到 300dpi,打印尺寸只有 5×7 厘米——改 DPI 改的是物理尺寸的换算,变不出新像素来。

PNG:pHYs 块与「像素每米」

PNG 把物理尺寸声明放在 pHYs 块里,内容三段:X 像素每单位、Y 像素每单位、单位标识。这里藏着格式史上一个冷知识:单位是「像素每米」,不是每英寸——国际单位制的坚持,让所有 dpi 数值都要过一道换算:ppu = dpi ÷ 0.0254,300dpi ≈ 11811 像素/米。单位标识为 0 时表示「长宽比未知,仅作参考」,不少软件默认导出的 PNG 压根没有 pHYs 块,读者只能假定一个默认密度(通常 72 或 96)。

PNG 是块状结构(上一段讲 GIF 时见过同类设计):每个块四段式——4 字节长度、4 字节类型(ASCII “pHYs”)、数据、4 字节 CRC32 校验。这就是字节级改写的两处硬活:找到 pHYs 块改写数值后,必须重算 CRC32——校验和覆盖类型+数据,数值一动旧校验立刻失配,较真的解码器直接拒载;若文件没有 pHYs 块,则在 IHDR(首个必备块)之后插入一个标准 pHYs 块,长度与偏移全部顺移。不解析到块这一层、只在字节流里「碰巧找到位置就改」,一个文件俩块结构就翻车。

JPEG:JFIF APP0 的 density

JPEG 走另一套:文件头 SOI(FFD8)之后紧跟 JFIF APP0 段,段内带单位标识(0 无单位、1 每英寸、2 每厘米)与 X/Y density 两个 16 位整数。改写逻辑与 PNG 对称:有 APP0 改字段(单位可以一并切换),没有就在 SOI 后插入一个标准 JFIF 头(version 1.01)。JPEG 的段是「2 字节长度自含」结构,没有 CRC——格式设计者认为压缩数据本身容错,元数据就不再包一层校验。

还有第三种声明的搅局:EXIF 里也有 XResolution/YResolution。相机直出文件可能 EXIF 与 JFIF/pHYs 各写一套、数值不一致,不同软件读取优先级不同——这就是「明明改成 300 了,看图软件还显示 72」的经典悬案。改写主流读取路径(pHYs/JFIF)后,以目标软件实际显示为准复核,是交付前的必要动作。

印刷的一笔账

物理尺寸与像素的换算,厘米制一行公式收束:像素 = 厘米 ÷ 2.54 × dpi;反向即 物理尺寸 = 像素 ÷ dpi × 2.54。常用数背下来能省一半沟通:

1
2
3
4
A4 21×29.7cm @300dpi ≈ 2480 × 3508 px
6寸照片 15.2×10.2cm @300dpi ≈ 1795 × 1205 px
名片 9×5.4cm @300dpi ≈ 1063 × 638 px
出血:每边多留 3mm ≈ +36px(@300dpi)

「300dpi」这个数字本身是铜版纸印刷的行业底线:低于它,网点的边缘肉眼可辨。屏幕则完全是另一本账——显示器 72/96/144ppi 只影响「像素映射到多大物理区域」,与印刷 dpi 殊途不同源。

动手改

🔧 图片DPI修改 做的是上面整套字节级改写:PNG 改 pHYs 重算 CRC32(无块则插)、JPEG 改 JFIF density(无段则插),自动检测当前 DPI 与物理尺寸,页面内的像素↔厘米/英寸换算器与文件改写共用同一套公式口径。改完 DPI 若发现打印尺寸不够大,下一步才是真正增加像素——用 🔧 图片尺寸调整 放大,或 🔧 图片压缩 反向控制体积;想看图里还藏着哪些拍摄信息,🔧 EXIF查看器 摊开元数据(那套体系在文件取证里拆过)。印刷交付的尺寸对照与模板,收在打印模板台专题里。