11
votes

Extraire des informations IPTC de JPEG à l'aide de JavaScript

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;

}


4 commentaires

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 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.


3 Réponses :


0
votes

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à.

http://www.iptc.org/ std / photométadonna / spécification / IPTC-photométadata% 28200907% 29_1.pdf


0 commentaires

6
votes

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);
    }


1 commentaires

Qu'est-ce que "Ofile" devrait avoir obtenu? Où est la définition de l'IPTC? Cela fonctionnera-t-il aussi pour PNG?



0
votes

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)
})


0 commentaires