【问题标题】:Find JPEG resolution with PHP使用 PHP 查找 JPEG 分辨率
【发布时间】:2010-09-20 16:44:27
【问题描述】:

呼吁所有 PHP 大师!

我知道您可以使用 getimagesize() 在 PHP 中获取图像的实际像素高度和宽度。但是,如果您在 Photoshop 中打开图像并查看图像大小对话框,您会注意到有一个分辨率值决定了图像的打印大小。

给定一个任意的 jpg 图像文件,我需要使用 PHP 来确定这个分辨率数。看来这些信息存储在某个地方的 jpg 文件中,那么我该如何获取呢?

另一个要求 - 我只有 gdlib 可供我使用。我需要在不使用其他 php 库(imagemagick 等)的情况下执行此操作

感谢您的帮助!

【问题讨论】:

    标签: php image-processing gdlib


    【解决方案1】:

    您可以直接读取 JPEG 文件,字节 14-18 指定:

    • 字节 14:01,X 和 Y 密度单位说明符(00:无,像素比率,01:DPI,02:DPC)
    • 字节 15-16:水平像素密度,
    • 字节 16-18:垂直像素密度

    另见:http://www.obrador.com/essentialjpeg/headerinfo.htm

    【讨论】:

    • 这是一些很棒的信息。现在如何使用 PHP 读取这些信息?
    • @Rafe - 当然是使用filesystem functions。图片也是人。
    【解决方案2】:

    分辨率(即打印时的 JPEG 分辨率,也简称为 DPI 或每英寸点数)可能会存储在两个位置。

    第一个位于 JPEG 的 JFIF 标头中,通常(但不总是)正好位于 JPEG 的开头。

    另一个在EXIF数据中。

    请注意,分辨率数据通常不存在,因为它仅在与物理输出大小相关联时才有意义。例如。如果数码相机写入值,通常是没有意义的。但是,当 JPEG 被输出到打印机(例如)时,该值将有意义。

    这里是一些从 JFIF 头中获取它的代码,前提是存在一个,并且位于文件中的第二个块 APP0 块内。 (第一个块始终是 SOI 标记。):

    function read_JFIF_dpi($filename)
    {
        $dpi = 0;
        $fp = @fopen($filename, r);
        if ($fp) {
            if (fseek($fp, 6) == 0) { // JFIF often (but not always) starts at offset 6.
                if (($bytes = fread($fp, 16)) !== false) { // JFIF header is 16 bytes.
                    if (substr($bytes, 0, 4) == "JFIF") { // Make sure it is JFIF header.
                        $JFIF_density_unit = ord($bytes[7]);
                        $JFIF_X_density = ord($bytes[8])*256 + ord($bytes[9]); // Read big-endian unsigned short int.
                        $JFIF_Y_density = ord($bytes[10])*256 + ord($bytes[11]); // Read big-endian unsigned short int.
                        if ($JFIF_X_density == $JFIF_Y_density) { // Assuming we're only interested in JPEGs with square pixels.
                            if ($JFIF_density_unit == 1) $dpi = $JFIF_X_density; // Inches.
                            else if ($JFIF_density_unit == 2) $dpi = $JFIF_X_density * 2.54; // Centimeters.
                        }
                    }
                }
            }
            fclose($fp);
        }
        return ($dpi);
    }
    

    【讨论】:

      【解决方案3】:

      解决方案:使用 PHP JPEG 元数据工具包 - 从这里下载:http://www.ozhiker.com/electronics/pjmt/

      这个工具包有一些方便的脚本,可以做各种各样的事情,包括查看和编辑 jpeg 文件中的标题、元数据和 jfif 信息。这是一个脚本,可为您提供 jpg 的 XDensity 和 YDensity(x 和 y 打印分辨率):

      <?php
      
      include_once("./JPEG.php");
      include_once("./JFIF.php");
      
      $image_header = get_jpeg_header_data("./myImage.jpg");
      $image_info = get_JFIF($image_header);
      
      print( "XDensity:" . $image_info['XDensity'] . "<br />");
      print( "YDensity:" . $image_info['YDensity'] . "<br />");
      
      ?>
      

      【讨论】:

      • 哇,很棒的剧本。它确实提供了有关图像的大量信息。谢谢@Rafe!
      【解决方案4】:

      根据图像的保存方式,EXIF 包含大量信息 - 在PHP manual 中了解更多信息。但是,您可能需要稍微解析/处理结果(例如,闪存信息是,或者至少曾经只是一个字节,表示各种状态)。

      【讨论】:

      • 我认为 EXIF 不包含分辨率/密度信息。另外,php EXIF 需要使用 exif lib 编译 php,这与我的问题中指定的要求相冲突。
      【解决方案5】:

      我不明白这一点。像素 = 打印尺寸 x 分辨率,像素数是一个设定值。因此,如果您有 300x300 像素的图像,则您有 1"x1" 的 300 DPI 分辨率、2"x2" 的 150 DPI 分辨率或 4"x4" 的 75 DPI 分辨率等。图像没有有一个分辨率,除非它有一个物理尺寸来比较它的像素尺寸。

      我错过了什么? (对于其他人来说,这有多明显?=])

      【讨论】:

      • 正是乔。 XDensity 和 YDensity 是我寻求的值。连同以像素为单位的高度和宽度,它们定义了图像的打印分辨率。
      • 另外,澄清一下,JPEG 图像有一个可选的 JFIF 元数据部分,可以包括 xdensity 和 ydensity。如果此信息不存在,则图形应用程序通常默认为 72 dpi 分辨率,但您始终可以选择更改此值,至少在 Photoshop 中是这样。
      • 我认为你错过了 JB 的观点。你有 X 像素,这是一成不变的。如果你也有一定的打印尺寸,你可以计算出你的分辨率,你不能从中增加它。如果你有一个固定的分辨率,你可以计算出你的打印尺寸,你也不能增加它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多