J'essaie d'extraire des informations de légende photo IPTC à partir d'un fichier JPEG à l'aide de JavaScript. (Je sais que je peux faire ce serveur, mais je cherche spécifiquement une solution JavaScript.)
J'ai trouvé ce script , qui extrait des informations exif ... mais je ne sais pas comment l'adapter pour saisir des données IPTC. P>
existe-t-il des scripts existants qui offrent une telle fonctionnalité? Sinon, comment modifieriez-vous le script EXIF pour analyser également les données IPTC? P>
MISE À JOUR B> P>
J'ai modifié le script EXIF ID ci-dessus. C'est sorta i> fait ce que je veux, mais cela ne saisit pas les bonnes données 100% du temps. P>
Après la ligne 401, j'ai ajouté: p>
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; }
3 Réponses :
Eh bien, cela devrait vous permettre de créer votre propre analyse JavaScript si vous ne trouvez pas une bibliothèque qui le fait déjà. P>
http://www.iptc.org/ std / photométadonna / spécification / IPTC-photométadata% 28200907% 29_1.pdf P>
Pour ce que ça vaut la peine, j'ai un peu extrapolé à ce sujet ... Je n'ai pas fait beaucoup de tests, mais les quelques images de test que j'ai semblés fonctionner.
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); }
Qu'est-ce que "Ofile" devrait avoir obtenu? Où est la définition de l'IPTC? Cela fonctionnera-t-il aussi pour PNG?
J'aimerais suggérer une bibliothèque EXIFR qui fonctionne à la fois au nœud.js et navigateur. Et il prend également en charge le nouveau format d'image HEIC.
exifr.parse(input, {iptc: true}).then(output => { console.log('IPTC', output) })
Cela ne sera possible que dans les navigateurs prenant en charge les API de fichier NEW-ISH HTML5. Ce script que vous avez lié apparaît i> pour obtenir des données d'image en la récupérant à partir du serveur, ce qui n'est probablement pas ce que vous voulez faire.
Oui, c'est parfaitement bon - je développe uniquement cela pour un usage interne, et nous avons tous reçu les derniers navigateurs, ce n'est donc pas un problème.
Cela ne fonctionne pas pour moi. Avez-vous un exemple de jsfiddle?
Pour quelqu'un d'autre qui a besoin d'un support croisé, JDataView est une bonne façon de travailler avec des données binaires dans Javascript.