2013-05-23 28 views
7

Tôi đã phải vật lộn cả ngày với vấn đề này và ngạc nhiên vì không thể tìm thấy bất kỳ tài liệu nào!Nhận hồ sơ ICC hình ảnh bằng PHP hoặc Imagick

Tôi đang tải hình ảnh lên trang web & muốn trích xuất tên của từng hình ảnh hồ sơ ICC & sử dụng hình ảnh trong mô tả hình ảnh. Cho đến nay, PHP chuẩn không tạo ra kết quả. Tôi đã kiểm tra hình ảnh bằng Photoshop, Bridge & Exiftool & từng đã xác định hồ sơ được nhúng.

<?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 sản xuất kết quả tốt nhất với:

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

Tạo một mảng mà thực sự đề cập đến hồ sơ cá nhân nhưng không phải là một chuỗi sử dụng được. Bất kỳ trợ giúp nào được đánh giá cao.

Tôi đang sử dụng các phiên bản này:

PHP Version 5.2.17 - imagick mô-đun phiên bản 3.0.1 - phiên bản ImageMagick 6.7.6-8

print_r lợi nhuận (đối với 'ProPhoto RGB' ICC profile):

Array ([icc] => KCMSmntrRGB XYZ: acspMSFTKODAROMM + KODAcprtHdesc \ wtptrTRCgTRCbTRCrXYZgXYZbXYZ, dmnd @ ndmddmmod (textCopy quyền (c) Công ty Eastman Kodak, 1999, tất cả các quyền được bảo lưu.desc ProPhoto RGB ProPhoto RGB ProPhoto RGBXYZ , curv XYZ 4I XYZ " > XYZ -descKODAK KODAKKODAKdesc'Reference Đầu ra Chỉ số Trung bình (Romm) (tham khảo Output Medium Metric (Romm) Reference Output Medium Metric (Romm) mmod;)

đầy đủ (từ 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

chuỗi mà bạn đang mong đợi trở lại – ejrowley

+0

Tôi đang tìm kiếm một cách để trả lại tên hồ sơ, vì vậy trong ví dụ này là gì: ProPhoto RGB – 20pictures

+0

Có thể thấy những gì các ký tự không thể in được thực sự là, để xem nếu bạn có thể phát hiện một mô hình? Ví dụ: chúng có thể là các ký tự rỗng (không). – halfer

Trả lời

4

tôi m không quá chắc chắn, nếu đây là trường hợp cho tất cả các hình ảnh. Ít nhất là những hình ảnh tôi có, có thông tin này trong "Properties" của họ. Vì vậy để có được một tên hồ sơ có thể in nó sẽ làm việc như thế này:

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

Nếu bạn muốn xem tất cả các thuộc tính, được thiết lập cho một hình ảnh, bạn có thể thăm dò hình ảnh bằng tay với identify -verbose /some/filename. Ở đó bạn sẽ phải tìm "Properties:", tên ICC nên được đặt ở đó.

Ở trên là cách dễ dàng để lấy tên hồ sơ ICC. Nếu bạn thực sự cần tên ICC từ hồ sơ cá nhân icc bạn có thể muốn có một cái nhìn tại ICC Profile Format Specification

Nói tóm lại:

  • 128 byte đầu tiên là tiêu đề. Sau đó, sau một bảng thẻ, trong đó 4 byte đầu tiên là kích thước của bảng.
  • Mỗi thẻ bao gồm 4 byte ba byte. 4 byts đầu tiên là tên của thẻ. Bốn byte tiếp theo là độ lệch của dữ liệu trong tệp icc. Bốn byte tiếp theo xác định kích thước của dữ liệu thẻ.

Chúng tôi quan tâm đến thẻ 'desc' (xem trang 63 trong đặc tả).

  • Bản thân mô tả bắt đầu lại bằng 'desc' thì bốn byte được đặt trước. Bốn byte tiếp theo xác định kích thước của tên cấu hình ICC.

Trong mã nó hoạt động như thế này:

$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"; 
    } 
}