PHP 7.0.20下图片DPI查询与修改:cardimg目录图片处理
解决PHP 7.0获取并修改图片DPI的问题
首先,你遇到的imageresolution()报错是因为这个函数是PHP 7.2及以上版本才新增的,你的PHP 7.0.20确实不支持它。下面分两部分解决你的问题:获取图片DPI,以及修改DPI值。
一、获取JPG图片的DPI信息
JPG的DPI数据存储在图片的EXIF元信息里,我们可以用PHP内置的exif_read_data()函数来读取。需要注意的是,你的PHP环境需要开启exif扩展(大部分默认环境已经开启,不确定的话可以用extension_loaded('exif')检查)。
修改后的代码示例:
$arr = glob("../cardimg/*.jpg"); foreach ($arr as $item) { // 获取图片宽高 list($width, $height) = getimagesize($item); echo "图片路径: {$item}<br>"; echo "宽: {$width} 像素<br>"; echo "高: {$height} 像素<br>"; // 读取EXIF元数据 $exifData = exif_read_data($item); if ($exifData) { // 提取DPI相关字段:ResolutionX/Y是分辨率数值,ResolutionUnit是单位(2=英寸,3=厘米) $dpiX = isset($exifData['ResolutionX']) ? $exifData['ResolutionX'] : '未知'; $dpiY = isset($exifData['ResolutionY']) ? $exifData['ResolutionY'] : '未知'; $unit = isset($exifData['ResolutionUnit']) ? $exifData['ResolutionUnit'] : 0; // 如果单位是厘米,转换为DPI(1英寸=2.54厘米) if ($unit == 3 && is_numeric($dpiX) && is_numeric($dpiY)) { $dpiX = round($dpiX * 2.54); $dpiY = round($dpiY * 2.54); } echo "DPI(X): {$dpiX}<br>"; echo "DPI(Y): {$dpiY}<br>"; } else { echo "未检测到EXIF元数据,无法获取DPI信息<br>"; } echo "<hr>"; }
这段代码会输出每张图片的宽高和DPI值,如果图片没有EXIF数据(比如被压缩过的图片),会提示无法获取。
二、将300DPI图片修改为72DPI
DPI是图片的元数据,修改它不会改变图片的像素尺寸,只是更新EXIF里的分辨率信息。推荐两种方法:
方法1:使用Imagick扩展(最简便)
如果你的服务器安装了Imagick扩展(PHP 7.0支持对应版本的Imagick),可以直接用它修改DPI:
$arr = glob("../cardimg/*.jpg"); foreach ($arr as $item) { try { $imagick = new Imagick($item); // 设置分辨率为72DPI(单位:像素/英寸) $imagick->setImageResolution(72, 72); $imagick->setImageUnits(Imagick::RESOLUTION_PIXELSPERINCH); // 保存修改后的图片(可以覆盖原文件,或者指定新路径) $imagick->writeImage($item); $imagick->destroy(); echo "成功将 {$item} 的DPI修改为72<br>"; } catch (Exception $e) { echo "处理 {$item} 失败:{$e->getMessage()}<br>"; } }
方法2:使用PEL库处理EXIF(无Imagick时可选)
如果没有Imagick,可以用PEL(PHP EXIF Library)来直接修改图片的EXIF元数据。首先需要通过Composer安装PEL:
composer require pel/pel
然后使用以下代码修改DPI:
require 'vendor/autoload.php'; use PEAR\PEL\PelJpeg; use PEAR\PEL\PelExif; use PEAR\PEL\PelEntryShort; use PEAR\PEL\PelTag; $arr = glob("../cardimg/*.jpg"); foreach ($arr as $item) { try { $jpeg = new PelJpeg($item); $exif = $jpeg->getExif(); // 如果图片没有EXIF,创建一个新的EXIF块 if (!$exif) { $exif = new PelExif(); $jpeg->setExif($exif); } // 获取IFD0(EXIF的第一个图像文件目录) $ifd0 = $exif->getTiff()->getIfd(); // 设置DPI为72,单位为英寸(PelTag::RESOLUTION_UNIT=2) $ifd0->setEntry(new PelEntryShort(PelTag::RESOLUTION_X, 72)); $ifd0->setEntry(new PelEntryShort(PelTag::RESOLUTION_Y, 72)); $ifd0->setEntry(new PelEntryShort(PelTag::RESOLUTION_UNIT, 2)); // 保存修改后的图片 $jpeg->saveFile($item); echo "成功将 {$item} 的DPI修改为72<br>"; } catch (Exception $e) { echo "处理 {$item} 失败:{$e->getMessage()}<br>"; } }
注意事项
- 修改DPI前建议备份原图片,避免意外损坏文件。
- 有些压缩工具会移除EXIF数据,这种情况下修改DPI后需要确保图片保留EXIF块。
- DPI仅影响打印或显示时的尺寸换算,不会改变图片的实际像素数量。
内容的提问来源于stack exchange,提问作者qadenza
相关产品推荐
相关产品推荐

