使用PHP GD / Imagick获取/设置DPI?

时间:2010-11-02 10:52:07

标签: php image-processing imagick

我正在构建一个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);

}

3 个答案:

答案 0 :(得分:3)

为了使用" 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"
    }

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:-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;
}