PHP ile JPEG çözünürlüğü bul

5 Cevap php

Tüm PHP guruları çağırıyor!

Ben PHP bir görüntünün gerçek piksel yükseklik ve genişliğini almak için getimagesize () kullanabilirsiniz anlıyorum. Eğer photoshop bir görüntüyü açmak ve görüntü boyutu iletişim bakarsanız Ancak, görüntünün baskı boyutunu belirler bir çözünürlük değeri olduğunu fark.

Keyfi bir jpg görüntüsü dosyası önüne alındığında, ben bu kararın sayısını belirlemek için PHP kullanmak gerekir. Bu bilgiler bir yerde jpg dosyasında saklanır görünür, bu yüzden onu nasıl alabilirim?

Bir diğer gereklilik - Ben sadece bana uygun GDlib var. Ben (imagemagick, vb) diğer php kütüphanelerin kullanımı olmadan bunu yapmak gerekiyor

Yardımın için teşekkürler!

5 Cevap

Sadece doğrudan JPEG dosyasını okuyabilir, 14-18 belirtmek bayt:

  • bayt 14: 01, X ve Y yoğunluğu birim belirleyici (00: yok, piksel oranları, 01: DPI, 02: DPC)
  • bayt 15-16: yatay piksel yoğunluğu,
  • byte 16-18: dikey piksel yoğunluklu

Ayrıca bakınız: http://www.obrador.com/essentialjpeg/headerinfo.htm

Bir çözünürlük (yazdırıldığında, JPEG yani çözünürlüğü de DPI veya inç başına nokta olarak kestirme anılacaktır) potansiyel saklanabilir iki yer vardır.

İlk sağ JPEG başında genellikle JPEG en JFıF başlığında, (ama her zaman değil) bulunmaktadır.

Diğer EXIF ​​verilerinde olduğunu.

Fiziksel bir çıkış büyüklüğü ile ilişkili eğer sadece anlam olarak bu çözünürlük veriler genellikle mevcut değildir unutmayın. Örneğin Bir dijital fotoğraf makinesi değer yazar ise, genellikle anlamsızdır. JPEG bir yazıcıda (örneğin) çıkış ediliyor Ancak, daha sonra değeri bir anlamı olacak.

İşte JFIF başlığından almak için bazı kod biri mevcut olması koşuluyla, ve dosyadaki ikinci yığınıdır bir APP0 yığın içinde. (Ilk öbek daima SOI belirtecidir.):

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);
}

ÇÖZÜM: Kullanıcı PHP JPEG Metadata Toolkit - buradan indirilebilir: http://www.ozhiker.com/electronics/pjmt/

Bu araç seti başlığında, meta, ve jpeg dosyası jfif bilgi görüntüleme ve düzenleme gibi şeyler her türlü yapacak bazı kullanışlı komut vardır. İşte size jpg XDensity ve YDensity (x ve y baskı çözünürlüğü) veren bir betik:

<?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 />");

?>

Ben bunu anlamıyorum. Piksel = printsize x çözünürlük ve piksel sayısı bir dizi değerdir. Eğer 300x300 piksel bir görüntü varsa Yani, vb 300 DPI çözünürlük 1 "x1", 150 DPI çözünürlük 2 "x2", veya 75 DPI çözünürlük 4 "x4" sahip bir görüntü {[(0)] } onun piksel boyutuna karşılaştırmak için fiziksel bir boyutu olmadığı sürece.

Ben ne kaçırıyorum nedir? (Ve bu herkes için ne kadar ışıl ışıl açıktır? =])

PHP manual bu konuda daha fazla bilgi - görüntü nasıl kaydedilir bağlı olarak, EXIF ​​bilgi metrik crapload içerir. Sen (flaş bilgisi, ya da en azından çeşitli durumlarını ifade, sadece bir bayt olmuştur örneğin) Ancak, sonuç süreç / biraz ayrıştırmak gerekebilir.