图像处理-使用PHP查找JPEG分辨率



调用所有PHP大师!

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

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

另一个需求-我只有gdlib可用。我需要在不使用其他php库(imagemagik等)的情况下完成这项工作。

谢谢你的帮助!

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

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

另请参阅:http://www.obrador.com/essentialjpeg/headerinfo.htm

有两个地方可以存储分辨率(即打印时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);
}

解决方案:使用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 />");
?>

根据图像的保存方式,EXIF包含一个信息量的度量-在PHP手册中了解更多信息。然而,您可能需要对结果进行一点解析/处理(例如,flash信息只是,或者至少已经是,只是一个字节,表示各种状态)。

我不明白。Pixels=打印尺寸x分辨率,像素数为设定值。因此,如果你有一个300x300像素的图像,你有1"x1"的300 DPI分辨率,2"x2"的150 DPI分辨率或4"x4"的75 DPI分辨率等。图像没有分辨率,除非它有一个物理大小可以与像素大小相比较。

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

最新更新