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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:43:18