4

呼吁所有 PHP 大师!

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

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

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

谢谢您的帮助!

4

5 回答 5

7

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

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

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

于 2008-11-04T15:16:50.573 回答
5

有两个地方可以潜在地存储分辨率(即打印时 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);
}
于 2011-09-05T15:02:11.600 回答
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 />");

?>
于 2008-11-04T16:35:20.150 回答
0

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

于 2008-11-04T15:27:05.063 回答
0

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

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

于 2008-11-04T16:59:55.890 回答