2011-04-29 27 views
10

का उपयोग कर जेपीईजी से आईपीटीसी जानकारी निकालें मैं जावास्क्रिप्ट का उपयोग कर जेपीईजी फ़ाइल से आईपीटीसी फोटो कैप्शन जानकारी निकालने की कोशिश कर रहा हूं। (मुझे पता है कि मैं यह सर्वर-साइड कर सकता हूं, लेकिन मैं विशेष रूप से जावास्क्रिप्ट समाधान के लिए देख रहा हूं।)जावास्क्रिप्ट

मुझे this script मिला, जो EXIF ​​जानकारी निकालता है ... लेकिन मुझे यकीन नहीं है कि इसे कैसे अनुकूलित किया जाए आईपीटीसी डेटा।

क्या ऐसी कोई मौजूदा स्क्रिप्ट है जो ऐसी कार्यक्षमता प्रदान करती है? यदि नहीं, तो आप आईपीटीसी डेटा को पार्स करने के लिए EXIF ​​स्क्रिप्ट को कैसे संशोधित करेंगे?

अद्यतन

मैं EXIF ​​स्क्रिप्ट मैं ऊपर लिंक संशोधित कर लिया है। यह सॉर्टा जो चाहता है वह करता है, लेकिन यह सही डेटा को 100 प्रतिशत समय तक नहीं पकड़ रहा है।

लाइन 401 के बाद, मैं कहा:

function readIPTCData(oFile, iStart, iLength) { 
    exif = new Array(); 

if (getStringAt(oFile, iStart, 9) != "Photoshop") { 
    if (bDebug) log("Not valid Photoshop data! " + getStringAt(oFile, iStart, 9)); 
    return false; 
} 

var output = ''; 
var count = 0; 
two = new Array(); 
for (i=0; i<iLength; i++) { 
    if (getByteAt(oFile, iStart + i) == 2 && getByteAt(oFile, iStart + i + 1) == 120) { 
     var caption = getString2At(oFile, iStart + i + 2, 800); 
    } 
    if (getByteAt(oFile, iStart + i) == 2 && getByteAt(oFile, iStart + i + 1) == 80) { 
     var credit = getString2At(oFile, iStart + i + 2, 300); 
    }  
} 

exif['ImageDescription'] = caption; 
exif['Artist'] = credit; 

return exif; 

} 

तो मुझे अब थोड़ा मेरे सवाल का संशोधित:

else if (iMarker == 237) { 
     // 0xED = Application-specific 13 (Photoshop IPTC)     
     if (bDebug) log("Found 0xFFED marker"); 
     return readIPTCData(oFile, iOffset + 4, getShortAt(oFile, iOffset+2, true)-2);      
} 

और फिर कहीं और लिपि में, मैं इस समारोह गयी। उपरोक्त कार्य में सुधार कैसे किया जा सकता है?

+0

यह केवल उन ब्राउज़र में संभव होगा जो नए-आईएसएच एचटीएमएल 5 फाइल एपीआई का समर्थन करते हैं। वह लिपि जो आपने लिंक की है * प्रकट होता है * इसे सर्वर से प्राप्त करके छवि डेटा प्राप्त करने के लिए, जो शायद आप नहीं करना चाहते हैं। – Pointy

+0

हां, यह बिल्कुल ठीक है - मैं इसे केवल आंतरिक उपयोग के लिए विकसित कर रहा हूं, और हम सभी को नवीनतम ब्राउज़र मिल गए हैं, इसलिए यह कोई समस्या नहीं है। – jawns317

+0

यह मेरे लिए काम नहीं कर रहा है। क्या आपके पास एक jsfiddle उदाहरण है? –

उत्तर

6

क्या इसके लायक है के लिए, मैं इस एक सा पर वाग्विस्तार ... मैं परीक्षण की एक पूरी बहुत कुछ नहीं किया है, लेकिन मैं कुछ परीक्षण छवियों काम करने के लिए लग रहे हैं।

var bDebug = false; 

    var fieldMap = { 
     120 : 'caption', 
     110 : 'credit', 
     25 : 'keywords', 
     85 : 'byline', 
     122 : 'captionWriter', 
     105 : 'headline', 
     116 : 'copyright', 
     15 : 'category' 
    }; 

    function readIPTCData(oFile, iStart, iLength) { 
     var data = {}; 

     if (oFile.getStringAt(iStart, 9) != "Photoshop") { 
      if (bDebug) log("Not valid Photoshop data! " + oFile.getStringAt(iStart, 9)); 
      return false; 
     } 

     var fileLength = oFile.getLength(); 

     var length, offset, fieldStart, title, value; 
     var FILE_SEPARATOR_CHAR = 28, 
      START_OF_TEXT_CHAR = 2; 

     for (var i = 0; i < iLength; i++) { 

      fieldStart = iStart + i; 
      if(oFile.getByteAt(fieldStart) == START_OF_TEXT_CHAR && oFile.getByteAt(fieldStart + 1) in fieldMap) { 
       length = 0; 
       offset = 2; 

       while(
        fieldStart + offset < fileLength && 
        oFile.getByteAt(fieldStart + offset) != FILE_SEPARATOR_CHAR && 
        oFile.getByteAt(fieldStart + offset + 1) != START_OF_TEXT_CHAR) { offset++; length++; } 

       if(!length) { continue; } 

       title = fieldMap[oFile.getByteAt(fieldStart + 1)]; 
       value = oFile.getStringAt(iStart + i + 2, length) || ''; 
       value = value.replace('\000','').trim(); 

       data[title] = value; 
       i+=length-1; 
      } 
     } 

     return data; 

    } 

    function findIPTCinJPEG(oFile) { 
     var aMarkers = []; 

     if (oFile.getByteAt(0) != 0xFF || oFile.getByteAt(1) != 0xD8) { 
      return false; // not a valid jpeg 
     } 

     var iOffset = 2; 
     var iLength = oFile.getLength(); 
     while (iOffset < iLength) { 
      if (oFile.getByteAt(iOffset) != 0xFF) { 
       if (bDebug) console.log("Not a valid marker at offset " + iOffset + ", found: " + oFile.getByteAt(iOffset)); 
       return false; // not a valid marker, something is wrong 
      } 

      var iMarker = oFile.getByteAt(iOffset+1); 

      if (iMarker == 237) { 
       if (bDebug) console.log("Found 0xFFED marker"); 
       return readIPTCData(oFile, iOffset + 4, oFile.getShortAt(iOffset+2, true)-2); 

      } else { 
       iOffset += 2 + oFile.getShortAt(iOffset+2, true); 
      } 

     } 

    } 

    IPTC.readFromBinaryFile = function(oFile) { 
     return findIPTCinJPEG(oFile); 
    } 
+0

'ओफाइल' क्या होने की उम्मीद है? आईपीटीसी की परिभाषा कहां है? क्या यह पीएनजी के लिए भी काम करेगा? – ItayB