2011-04-29 11 views
10

Estoy tratando de extraer información de subtítulos de IPTC desde un archivo JPEG usando Javascript. (Sé que puedo hacer esto desde el servidor, pero estoy buscando específicamente una solución de Javascript.)Extraiga información de IPTC de JPEG usando Javascript

Encontré this script, que extrae información EXIF ​​... pero no estoy seguro de cómo adaptarla para tomar Datos de IPTC

¿Hay scripts existentes que ofrezcan dicha funcionalidad? De lo contrario, ¿cómo modificaría el script EXIF ​​para analizar también los datos IPTC?

ACTUALIZACIÓN

He modificado el guión EXIF ​​he vinculado anteriormente. Es sorta hace lo que quiero, pero no está tomando los datos correctos el 100 por ciento del tiempo.

Después de la línea 401, que añade:

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

Y luego en el resto del guión, añade esta función:

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; 

} 

Así que ahora me modifico mi pregunta ligeramente. ¿Cómo se puede mejorar la función anterior?

+0

Esto solo será posible en los navegadores compatibles con las nuevas API de archivos HTML5. La secuencia de comandos que ha vinculado * aparece * para obtener datos de imagen al obtenerlos del servidor, que probablemente no es lo que quiere hacer. – Pointy

+0

Sí, está perfectamente bien. Estoy desarrollando esto solo para uso interno, y todos tenemos los últimos navegadores, por lo que no es un problema. – jawns317

+0

Esto no funciona para mí. ¿Tienes un ejemplo jsfiddle? –

Respuesta

6

Por lo que vale la pena, que extrapola en esto un poco ... No he hecho un montón de pruebas, pero las pocas imágenes de prueba que tengo parece funcionar.

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

¿Qué espera obtener 'oFile'? ¿Dónde está la definición de IPTC? ¿Funcionará para PNG también? – ItayB

Cuestiones relacionadas