2013-05-23 10 views
7

के साथ छवि आईसीसी प्रोफाइल प्राप्त करें मैं इस मुद्दे के साथ पूरे दिन संघर्ष कर रहा हूं और हैरान हूं कि कोई दस्तावेज नहीं मिल रहा है!PHP या इमेजिक

मैं एक वेबसाइट & पर छवियों को अपलोड कर रहा हूं प्रत्येक छवि का नाम निकालना चाहता हूं आईसीसी प्रोफाइल & छवि विवरण में इसका उपयोग करें। अब तक, मानक PHP कोई परिणाम नहीं पैदा करता है। मैंने फ़ोटोशॉप के साथ छवियों की जांच की है, ब्रिज & 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)); 

एक सरणी है कि वास्तव में प्रोफ़ाइल नहीं बल्कि एक प्रयोग करने योग्य स्ट्रिंग का उल्लेख है जनरेट कर रहा है। किसी भी मदद की सराहना की। Imagick मॉड्यूल 3.0.1 संस्करण - - ImageMagick संस्करण 6.7.6-8

और print_r रिटर्न ('ProPhoto के लिए

पीएचपी संस्करण 5.2.17:

मैं इन संस्करणों का उपयोग कर रहा हूँ आरजीबी 'ICC प्रोफ़ाइल):

सरणी ([आईसीसी] => KCMSmntrRGB XYZ: acspMSFTKODAROMM + KODAcprtHdesc \ wtptrTRCgTRCbTRCrXYZgXYZbXYZ, dmnd @ ndmddmmod (textCopy दाएं (सी) ईस्टमैन कोडक कंपनी, 1 999, सभी अधिकार सुरक्षित डीएससीसी प्रोफोटो आरजीबीएप्रोफोटो आरजीबी प्रोफोटो आरजीबीएक्सवाईड , curv XYZ 4IXXZ " > XYZ -descKODAK KODAKKODAKDesc 'संदर्भ आउटपुट मध्यम मीट्रिक (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 आरजीबी – 20pictures

+0

हो सकता है कि यह देखने के लिए कि आप एक पैटर्न को खोज सकते हैं या नहीं, वास्तव में उन अनपेक्षित पात्र क्या हैं? उदाहरण के लिए, वे शून्य (शून्य) वर्ण हो सकते हैं। – halfer

उत्तर

4

मैं मुझे यकीन नहीं है, अगर यह सभी छवियों के लिए मामला है। मेरे पास कम से कम छवियां हैं, इस जानकारी को उनके "गुण" में है।

$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 Profile Format Specification

पर एक नज़र लेने के लिए चाहते हो सकता है अगर तुम सच में आईसीसी प्रोफ़ाइल से आईसीसी नाम की जरूरत है:

  • पहले 128 बाइट्स हैडर कर रहे हैं। फिर एक टैग टेबल का पालन करता है, जहां पहले 4 बाइट टेबल का आकार होते हैं।
  • प्रत्येक टैग में 4 बाइट ट्रिपलेट होते हैं। पहले 4 बाइट टैग का नाम हैं। अगले चार बाइट आईसीसी फ़ाइल में डेटा के ऑफसेट हैं। अगले चार बाइट टैग डेटा के आकार को परिभाषित करते हैं।

हम 'desc' टैग में रुचि रखते हैं (विनिर्देश में पृष्ठ 63 देखें)।

  • विवरण स्वयं 'desc' के साथ फिर से शुरू होता है तो चार बाइट आरक्षित होते हैं। अगले चार बाइट आईसीसी प्रोफाइल नाम के आकार को परिभाषित करते हैं।

कोड में यह इस तरह काम करता है:

$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"; 
    } 
} 
संबंधित मुद्दे