召集所有PHP大师!
据我所知,您可以使用getimagesize()来获取PHP中图像的实际像素高度和宽度。但是,如果您在Photoshop中打开图像并查看图像大小对话框,您会注意到有一个分辨率值决定了图像的打印尺寸。
给定一个任意的jpg图像文件,我需要用PHP来确定这个分辨率。看来这个信息存储在某个地方的jpg文件中,所以我该怎么做呢?
另一个要求 - 我只有gdlib可供我使用。我需要在不使用其他php库(imagemagick等)的情况下执行此操作
感谢您的帮助!
答案 0 :(得分:6)
您可以直接读取JPEG文件,字节14-18指定:
答案 1 :(得分: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);
}
答案 2 :(得分: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 />");
?>
答案 3 :(得分:1)
我不明白这一点。像素=打印尺寸x分辨率,像素数是设定值。因此,如果你有一个300x300像素的图像,你有1“x1”的300 DPI分辨率,2“x2”的150 DPI分辨率,或4“x4”的75 DPI分辨率等。图像没有具有分辨率,除非它具有与其像素大小相比的物理尺寸。
我错过了什么? (而且对其他人来说这是多么明显?=])
答案 4 :(得分:0)
根据图像的保存方式,EXIF包含一系列公制信息 - 请在PHP manual中详细了解相关信息。您可能需要稍微解析/处理结果(例如,闪存信息是,或者至少是一个字节,表示各种状态)。