4

すべてのPHPの達人を呼びます!

getimagesize()を使用して、PHPで画像の実際のピクセルの高さと幅を取得できることを理解しています。ただし、フォトショップで画像を開いて[画像サイズ]ダイアログを見ると、画像の印刷サイズを決定する解像度値があることがわかります。

任意のjpg画像ファイルが与えられた場合、この解像度番号を決定するためにPHPを使用する必要があります。この情報はjpgファイルのどこかに保存されているようですが、どうすれば入手できますか?

もう1つの要件-私が利用できるのは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 または 1 インチあたりのドット数とも呼ばれます) を保存できる可能性のある場所が 2 つあります。

1 つ目は JPEG の JFIF ヘッダーにあり、多くの場合 (常にではありません) JPEG の先頭にあります。

もう 1 つは EXIF データにあります。

物理的な出力サイズに関連付けられている場合にのみ意味があるため、解像度データは通常存在しないことに注意してください。たとえば、デジタル カメラが値を書き込む場合、通常は意味がありません。ただし、JPEG がプリンタに出力されている場合 (たとえば)、値には意味があります。

JFIF ヘッダーからそれを取得するためのコードを次に示します。ただし、ヘッダーが存在し、ファイルの 2 番目のチャンクである 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

私はこれを理解していません。画素数=印刷サイズ×解像度、画素数は設定値です。したがって、300x300 ピクセルの画像がある場合、1"x1" の 300 DPI 解像度、2"x2" の 150 DPI 解像度、または 4"x4" の 75 DPI 解像度などがあります。画像には解像度がありません。ピクセル サイズと比較する物理的なサイズがない限り。

私が見逃しているのは何ですか?(そして、他の人にとってそれはどれほど明白ですか? =] )

于 2008-11-04T16:59:55.890 に答える
0

画像の保存方法に応じて、EXIF には大量の情報が含まれています。詳細については、PHP マニュアルを参照してください。ただし、結果を少し解析/処理する必要がある場合があります (たとえば、フラッシュ情報は、さまざまな状態を表す 1 バイトであるか、少なくとも 1 バイトでした)。

于 2008-11-04T15:27:05.063 に答える