2013-05-23 2 views
7

Я изо всех сил стараюсь изо дня в день с этой проблемой и удивлен, что не могу найти никакой документации!Получить изображение Профиль ICC с PHP или Imagick

Я загружаю изображения на сайт & хотел бы извлечь имя каждого изображения ICC-профиля & использовать его в описании изображения. Пока что стандартный PHP не дает никаких результатов. Я проверил изображения с помощью Photoshop, Bridge & Exiftool & каждый определил профиль, встроенный.

<?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 получают лучшие результаты с:

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

Создание массива, который фактически упоминает профиль, но не использовать строку. Любая помощь оценивается.

Я использую эти версии:

PHP Version 5.2.17 - Imagick модуль версии 3.0.1 - ImageMagick версия 6.7.6-8

И print_r возвращает (для «Prophoto профиль ICC RGB»):

Array ([МЦХ] => KCMSmntrRGB XYZ: acspMSFTKODAROMM + KODAcprtHdesc \ wtptrTRCgTRCbTRCrXYZgXYZbXYZ, DMND @ ndmddmmod (textCopy право (c) Eastman Kodak Company, 1999, все права защищены.desc ProPhoto RGB ProPhoto RGB ProPhoto RGBXYZ , curv XYZ 4I XYZ " > XYZ -descKODAK KODAKKODAKdesc'Reference Выходная среда Метрическая (ROMM) (Ссылка Выход Средняя Метрика (ROMM) 'Ссылка Выход Средняя Метрика (ROMM) mmod;)

в полном объеме (от 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

Что это строка, что вы ожидаете назад – ejrowley

+0

Я ищу способ, чтобы вернуть имя профиля, поэтому в данном примере: ProPhoto RGB – 20pictures

+0

Может быть, посмотрите, каковы эти непечатаемые персонажи, чтобы увидеть, можете ли вы найти образец? Например, они могут быть нулевыми (ноль) символами. – halfer

ответ

4

Я m не слишком уверен, если это относится ко всем изображениям. По крайней мере, изображения, которые у меня есть, имеют эту информацию в их «Свойствах». Таким образом, чтобы получить печати имя профиля, он должен работать так:

$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') 
*/ 

Если вы хотите, чтобы увидеть все свойства, которые устанавливаются для изображения, можно зондировать изображение вручную с identify -verbose /some/filename. Там вам нужно искать «Свойства:», там должно быть указано имя ICC.

Вышеупомянутый - это простой способ получить имя профиля ICC. Если вам действительно нужно имя ICC из профиля ICC вы можете взглянуть на ICC Profile Format Specification

Короче:

  • Первые 128 байт заголовка. Затем следует таблица тегов, где первые 4 байта - это размер таблицы.
  • Каждый тег состоит из 4-байтовых триплетов. Первые 4 байта - это имя тега. Следующие четыре байта - это смещение данных в файле icc. Следующие четыре байта определяют размер данных тегов.

Нам интересен тег 'desc' (см. Страницу 63 в спецификации).

  • Описание само начинается снова с 'desc', тогда зарезервированы четыре байта. Следующие четыре байта определяют размер имени профиля ICC.

В коде это работает так:

$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"; 
    } 
} 
Смежные вопросы