2013-05-23 17 views
7

Cały dzień zmagałem się z tym problemem i zdziwiłem się, że nie mogę znaleźć żadnej dokumentacji!Pobierz obraz Profil ICC z PHP lub Imagick

Przesyłam obrazy na stronę internetową & Chciałbym wyodrębnić nazwę każdego obrazu profilu ICC & użyć go w opisie obrazu. Jak dotąd standardowy PHP nie daje żadnych wyników. Sprawdziłem obrazy za pomocą programu Photoshop, Bridge & Exiftool &, z których każdy zidentyfikował osadzony profil.

<?php 
$info = exif_read_data($image); 
echo 'ICC Profile: '.$info['ICC_Profile'].'<br>'; 
echo 'ICC Profile: '.$info['CurrentICCProfile'].'<br>'; 
echo 'ICC Profile: '.$info['ColorSpace'].'<br>'; 
?> 

Imagick wyprodukowany najlepsze rezultaty:

$imagick = new Imagick(); 
$imagick->readImage($image); 
print_r ($imagick->getImageProfiles("icc",true)); 

Generowanie tablicę, która rzeczywiście wspomina profil, ale nie nadające się ciąg. Każda pomoc doceniona.

używam te wersje:

PHP w wersji 5.2.17 - Imagick moduł Wersja 3.0.1 - wersja ImageMagick 6.7.6-8

I print_r powroty (dla „ProPhoto RGB profilem ICC)

Array ([ICC] => KCMSmntrRGB XYZ: acspMSFTKODAROMM + KODAcprtHdesc \ wtptrTRCgTRCbTRCrXYZgXYZbXYZ, DMND @ ndmddmmod (textCopy right (c) Eastman Kodak Company, 1999, wszystkie prawa zastrzeżone. ProPhoto RGB ProPhoto RGB ProPhoto RGBXYZ , curv XYZ 4I XYZ " > XYZ -descKODAK KODAKKODAKdesc'Reference Output Medium Metric (Romm) (Wyjście referencyjny Średni Metric (Romm) "referencyjny wyjściowe średnie Metric (Romm) mmod;)

w całości (od Exiftool):

Profile CMM Type    : KCMS 
Profile Version     : 2.1.0 
Profile Class     : Display Device Profile 
Color Space Data    : RGB 
Profile Connection Space  : XYZ 
Profile Date Time    : 1998:12:01 18:58:21 
Profile File Signature   : acsp 
Primary Platform    : Microsoft Corporation 
CMM Flags      : Not Embedded, Independent 
Device Manufacturer    : KODA 
Device Model     : ROMM 
Device Attributes    : Reflective, Glossy, Positive, Color 
Rendering Intent    : Perceptual 
Connection Space Illuminant  : 0.9642 1 0.82487 
Profile Creator     : KODA 
Profile ID      : 0 
Profile Copyright    : Copyright (c) Eastman Kodak Company, 1999, all rights reserved. 
Profile Description    : ProPhoto RGB 
Media White Point    : 0.9642 1 0.82489 
Red Tone Reproduction Curve  : (Binary data 14 bytes, use -b option to extract) 
Green Tone Reproduction Curve : (Binary data 14 bytes, use -b option to extract) 
Blue Tone Reproduction Curve : (Binary data 14 bytes, use -b option to extract) 
Red Matrix Column    : 0.79767 0.28804 0 
Green Matrix Column    : 0.13519 0.71188 0 
Blue Matrix Column    : 0.03134 9e-005 0.82491 
Device Mfg Desc     : KODAK 
Device Model Desc    : Reference Output Medium Metric(ROMM) 
Make And Model     : (Binary data 40 bytes, use -b option to extract) 
+0

Jaki jest ciąg znaków, który spodziewasz powrotem – ejrowley

+0

szukam sposobu na powrót nazwę profilu, a więc w tym przykładzie: ProPhoto RGB – 20pictures

+0

Może zobacz, czym właściwie są te niezadrukowane postacie, aby sprawdzić, czy potrafisz rozpoznać wzór? Mogą to być na przykład znaki zerowe (zero). – halfer

Odpowiedz

4

I nie jestem zbyt pewny, jeśli tak jest w przypadku wszystkich zdjęć. Przynajmniej obrazy, które mam, mają tę informację w ich "Właściwościach". Tak więc, aby uzyskać nadruku nazwy profilu powinno działać tak:

$imagick = new imagick('/some/filename'); 
$profile = $imagick->getImageProperties('icc:model', true); 
/** 
* If the property 'icc:model' is set $profile now should be: 
* array('icc:model' => 'ICC model name') 
*/ 

Jeśli chcesz zobaczyć wszystkie właściwości, które zostały przedstawione na obrazie, można próbkować obraz ręcznie z identify -verbose /some/filename. Tam będziesz musiał szukać "Właściwości:", nazwa ICC powinna być tam ustawiona.

Powyższe stanowi łatwy sposób uzyskania nazwy profilu ICC. Jeśli naprawdę potrzebujesz nazwę ICC z profilem ICC może warto spojrzeć na ICC Profile Format Specification

W skrócie:

  • Pierwsze 128 bajtów nagłówka. Następnie następuje tabela znaczników, w której pierwsze 4 bajty są wielkością tabeli.
  • Każdy tag składa się z 4-bajtowych tripletów. Pierwsze 4 bajty są nazwą znacznika. Następne cztery bajty są przesunięciem danych w pliku icc. Następne cztery bajty określają rozmiar danych znaczników.

Interesuje nas tag "desc" (patrz strona 63 w specyfikacji).

  • Sam opis zaczyna się od "desc", a następnie cztery bajty są zarezerwowane. Następne cztery bajty określają rozmiar nazwy profili ICC.

W kodzie to działa tak:

$image = new imagick('/path/to/img'); 
try { 
    $existingICC = $image->getImageProfile('icc'); 
} catch (ImagickException $e) { 
    // Handle it 
    $existingICC = null; 
} 

if($existingICC) { 
    // Search the start of the description tag in the tag table.: 
    // We are not looking in the 128 bytes for the header + 4 bytes for the size of the table 
    $descTagPos = stripos($existingICC, 'desc', 131); 
    if($descTagPos === false) { 
     // There is no description, handle it. 
    } else { 
     // This is the description Tag ('desc'|offset|size each with a size of 4 bytes 
     $descTag = substr($existingICC, $descTagPos, 12); 

     // Get the offset out of the description tag, unpack it from binary to hex and then from hex to decimal 
     $descTagOffset = substr ($descTag, 4, 4); 
     $descTagOffset = unpack('H*', $descTagOffset); 
     $descTagOffset = hexdec($descTagOffset[1]); 

     // Same for the description size 
     $descTagSize = substr ($existingICC, $descTagPos + 8, 4); 
     $descTagSize = unpack('H*', $descTagSize); 
     $descTagSize = hexdec($descTagSize[1]); 

     // Here finally is the descripton 
     $iccDesc = substr($existingICC, $descTagOffset, $descTagSize); 

     // See page 63 in the standard, here we extract the size of the ICC profile name string 
     $iccNameSize = substr($iccDesc, 8, 4); 
     $iccNameSize = unpack('H*', $iccNameSize); 
     $iccNameSize = hexdec($iccNameSize[1]); 

     // Finally got the name. 
     $iccName = substr($iccDesc, 12, $iccNameSize); 
     echo "ICC name: $iccName\n"; 
    } 
}