2010-08-04 51 views
8

Estoy usando una biblioteca llamada EXIFextractor para extraer información de metadatos de imágenes. Este lib en parte está usando System.Drawing.Imaging.PropertyItem para hacer todo el trabajo duro. Algunos de los datos en PropertyItem, como Detalles de la imagen, etcétera, se captan como una cadena ASCII almacenada en un byte [] de acuerdo con la documentación de Microsoft.C#: Convertir byte [] en cadena codificada en UTF8

Mi problema es que los caracteres internacionales (å, ä, ö, etcétera) se eliminan y reemplazan por questionmarks. Cuando depuro el código, es evidente que el byte [] es una representación de un UTF-8.

Me gustaría analizar el byte [] como una cadena UTF8, ¿cómo puedo hacer esto sin perder ninguna información en el proceso?

¡Gracias de antemano!


Actualización:

me ha pedido para proporcionar un fragmento de mi código:

El primer fragmento es de la clase que yo uso, es decir, los escrito por EXIFextractor.cs Asim Goheer

foreach(System.Drawing.Imaging.PropertyItem p in parr) 
{ 
string v = ""; 

       // ... 

else if(p.Type == 0x2) 
{ 
    // string  
    v = ascii.GetString(p.Value); 
} 

Y este es mi código donde hago mi mejor esfuerzo para manejar t El resultado de lo anterior.

   try { 
    EXIFextractor exif = new EXIFextractor(ref bmp, ""); 
    object o; 
        if ((o = exif["Image Description"]) != null) 
         MediaFile.Description = Tools.UTF8Encode(o.ToString()); 

también he intentado un par de otras maneras de conseguir mi precioso å, ä, ö partir de los datos, pero nada parece hacer el truco. Estoy empezando a pensar que Hans Passant tiene razón sobre sus conclusiones en su respuesta a continuación.

+0

Si la información se lee usando codificación ASCII, los caracteres que no sean ASCII no se leerán correctamente como consecuencia. Esta lectura de caracteres con codificación y luego escritura en una matriz de bytes no suena bien. ¿Puede vincular a la documentación que establece que este es el caso? –

+1

Aquí está, si tengo permiso para publicar otro hipervínculo :) http://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.type.aspx – dotmartin

Respuesta

32
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray); 
+1

Gracias por la respuesta rápida. Sin embargo, ya lo he intentado. Sin suerte. Estoy comenzando a preguntarme si las fuentes (archivos de imagen) están codificadas correctamente en primer lugar. – dotmartin

+0

Si puede compartir un ejemplo, podemos verificarlo o probarlo por nuestra cuenta. – Scoregraphic

+1

Por supuesto. Como soy nuevo en esto, ¿debo proporcionarlo como respuesta o en un comentario, o cuál es la forma preferida de hacerlo? – dotmartin

1

¿Tal vez podría probar con otra codificación? UTF16, Unicode? Si no está seguro si recibió codificaciones desde el principio, intente ver los metadatos exif con otro lector exif.

2

Sí, esto es un problema con la aplicación o la cámara que originó la imagen. El estándar EXIF ​​tiene un soporte horrible para el texto, tiene que estar codificado en ASCII. Eso solo funciona bien cuando el fotógrafo habla inglés. Sin duda, el software que codificó la imagen está ignorando este requisito. Que es lo que está haciendo la clase PropertyItem también, codifica una cadena para byte [] con Marshal.StringToHGlobalAnsi(), que asume la página de códigos predeterminada del sistema.

No hay una solución obvia para esto, obtendrá mojibake cuando la foto esté demasiado alejada de su máquina.

+1

Esto era lo que esperaba. Siempre esperé que Photoshop y la herramienta integrada de XMP pudieran aclarar las cosas. ¿Hay alguna sugerencia sobre qué se podría hacer para resolver el problema? Mi empresa tiene muchos archivos con una codificación incorrecta, por lo que se preferiría un procesador por lotes. – dotmartin

+0

¿Sigue siendo cierto que en la matriz de bytes todos los bytes son correctos de acuerdo con su configuración regional? Si es así, puedes intentar codificar/decodificar usando tu localidad en lugar de UTF8/ascii. Consulte http://msdn.microsoft.com/en-us/library/system.text.encoding.getencoding.aspx – Scoregraphic

+0

Sin suerte. Aún recibo los cuestionarios. – dotmartin

Cuestiones relacionadas