You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP imagejpeg()函数始终输出96DPI,如何改为72DPI?

解决PHP imagejpeg()生成图片DPI固定为96的问题

首先明确:imagejpeg()的第三个参数是图像压缩质量,和图片的DPI(每英寸点数)完全无关。DPI是存储在图片元数据里的参考值,不影响图片的实际像素尺寸,GD库生成的JPEG默认会写入96 DPI的元数据。

要生成72 DPI的图片,需要手动给图片添加对应的Exif元数据,以下是两种可行方案:

方案一:使用GD+Exif扩展(纯PHP原生方案)

通过GD生成图片后,嵌入包含72 DPI的Exif信息:

// 假设$newimg是你已经处理好的GD图像资源
// 将图片内容输出到缓冲区
ob_start();
imagejpeg($newimg, null, 80); // 80为压缩质量
$image_content = ob_get_clean();

// 构建Exif元数据,设置72 DPI
$exif_data = [
    'IFD0' => [
        'XResolution' => 72,
        'YResolution' => 72,
        'ResolutionUnit' => 2 // 单位为英寸
    ]
];

// 将Exif数据写入图片
$final_image = exif_write_data($image_content, null, $exif_data);

// 保存到目标路径
file_put_contents($path, $final_image);

// 销毁GD资源
imagedestroy($newimg);

注意:需要确保PHP已启用Exif扩展,且PHP版本≥7.2(exif_write_data支持写入字符串内容)。

方案二:使用Imagick扩展(更简洁)

如果服务器支持Imagick扩展,代码会更直观:

// 从GD资源获取图片内容
ob_start();
imagejpeg($newimg, null, 80);
$image_content = ob_get_clean();
imagedestroy($newimg);

// 用Imagick处理并设置DPI
$imagick = new Imagick();
$imagick->readImageBlob($image_content);
$imagick->setImageResolution(72, 72);
$imagick->setImageUnits(Imagick::RESOLUTION_PIXELSPERINCH);
$imagick->writeImage($path);
$imagick->destroy();

补充说明:DPI只是打印或部分软件显示时的参考参数,修改它不会改变图片的实际像素数量或清晰度,仅影响图片在物理介质上的打印尺寸计算。

内容的提问来源于stack exchange,提问作者provance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:37:01