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
相关产品推荐
相关产品推荐

