15

我正在构建一个 Web 应用程序,它将处理最终将打印的大格式图像文件。

作为其中的一部分,我需要获取(即读取)和设置(即更改)图像文件的 DPI。

这可以通过 PHP GD 或 PHP Imagick 实现吗?

谢谢,

BK


编辑:

可以通过 iMagick 的getImageResolution方法访问图像的 DPI:

public function getDPI() {

    $imgDPI = $this->image->getImageResolution();
    return $imgDPI;

}

并且可以通过 iMagick 的setImageResolution方法设置图像的 DPI:

public function setDPI($DPIX, $DPIY) {

    $this->image->setImageResolution($DPIX,$DPIY);

}
4

3 回答 3

4

为了使用“getImageResolution();” 您必须确保“PixelsPerInch”中的分辨率......有时它可以是“PixelsPerCentimeter”

使用以下代码获取图像信息:

$imagick = new Imagick($filename);
$data = $imagick->identifyimage();
var_dump($data);

结果(当 PixelsPerInch 时):

array(11) {
              ["imageName"]=> string(11) "/jpg300.jpg"
              ["format"]=> string(51) "JPEG (Joint Photographic Experts Group JFIF format)"
              ["units"]=> string(13) "PixelsPerInch"
              ["type"]=> string(9) "TrueColor"
              ["colorSpace"]=> string(3) "RGB"
              ["compression"] => string(4) "JPEG"
              ["fileSize"] => string(6) "8.72mb"
              ["mimetype"] => string(10) "image/jpeg"
              ["geometry"] => array(2) {
                        ["width"]  => int(11812)
                        ["height"] => int(7876)
              }
              ["resolution"]=> array(2) {
                    ["x"]=> float(300)
                    ["y"]=> float(300)
              }
              ["signature"]=> string(64) "7fc387ea465ec716e9fd6e233bb1d3740cb509f5667ed2a4df0199e6e664590e"
            }

或(当 PixelsPerCentimeter):

    array(11) {
      ["imageName"]=> string(8) "/psm.jpg"
      ["format"]=> string(51) "JPEG (Joint Photographic Experts Group JFIF format)"
      ["units"]=> string(19) "PixelsPerCentimeter"
      ["type"]=> string(9) "TrueColor"
      ["colorSpace"]=> string(3) "RGB"
      ["compression"]=> string(4) "JPEG"
      ["fileSize"]=> string(7) "25.01mb"
      ["mimetype"]=> string(10) "image/jpeg"
      ["geometry"]=>
      array(2) {
        ["width"]=> int(11812)
        ["height"]=> int(7876)
      }
      ["resolution"]=>
      array(2) {
        ["x"]=> float(118.11)
        ["y"]=> float(118.11)
      }
      ["signature"]=> string(64) "b491e059624e79a4dee62d9cc7646019927b2222bfed9ac8dd4342185e648eaf"
    }
于 2014-08-21T16:03:22.837 回答
2

在 GD 输出的原始位图格式中,dpi 设置只是处理应用程序可以用来将像素大小转换为物理单位的元信息。

据我所知,直接在 GD 中操作元数据是不可能的。您必须为此使用外部库。

话虽如此,我认为没有必要。只需生成您需要的任何像素尺寸的图像(像素数是真正相关的信息!),并告诉打印过程使用什么 dpi 设置。

于 2010-11-02T10:54:48.330 回答
-1

这是我在 Joox.io 的工作解决方案

/**
 * @param $filename
 * @return array
 */
function getImageDPI($filename)
{
    $resolutions = null;

    if (class_exists('Imagick')) {

        $image = new Imagick($filename);
        $resolutions = $image->getImageResolution();

    } else {

        $a = fopen($filename, 'r');
        $string = fread($a, 20);
        fclose($a);

        $data = bin2hex(substr($string, 14, 4));
        $x = substr($data, 0, 4);
        $y = substr($data, 4, 4);

        $resolutions = array('x' => hexdec($x), 'y' => hexdec($y));

    }

    return $resolutions;
}
于 2016-10-08T02:37:40.813 回答