¿Cómo puedo realizar una matriz de bytes de una imagen TIFF y convertirlo en un Sistema.De dibujo.Objeto de la imagen?

StackOverflow https://stackoverflow.com/questions/32750

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un byte[] matriz, el contenido de los cuales representa un archivo TIFF (como en, si yo escribo estos bytes directamente a un archivo con el BinaryWriter objeto, se forma perfectamente válida de archivo TIFF) y estoy tratando de convertirlo en un Sistema.De dibujo.Objeto de la imagen, así que la voy a usar para su posterior manipulación (en la alimentación de un TIFF objeto)

El problema que estoy teniendo es que la comúnmente aceptada de código para esta tarea:

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true);
        return returnImage;
    }

no funciona para mí.La segunda línea del método anterior, donde se llama a la Image.FromStream método muere en tiempo de ejecución, diciendo:

Parameter Not Valid

Creo que el método que se está ahogando en el hecho de que este es un archivo TIFF, pero no puedo averiguar cómo hacer que el FromStream método de aceptar este hecho.

¿Cómo puedo convertir una matriz de bytes de una imagen TIFF en un objeto de Imagen?

También, como he dicho, el objetivo final de esto es tener una matriz de bytes que representa un archivo TIFF de varias páginas, que contiene los archivos TIFF para los que me han matriz de bytes objetos de ahora.Si existe una mejor manera de ir sobre hacer esto, yo soy todo para él.

¿Fue útil?

Solución

Editar: La suposición no es correcta, he tenido la oportunidad de disparar hasta mi IDE más tarde y probado con y sin Escribir y tanto pobladas MemoryStream correctamente.

Creo que usted necesita para escribir a su MemeoryStream primera.

Como si mi memoria (ningún retruécano previsto) me sirve correctamente este:

MemoryStream ms = new MemoryStream(byteArrayIn);

Crea una secuencia de memoria de ese tamaño.

A continuación, deberá escribir su matriz de bytes contenidos para la secuencia de memoria:

ms.Write(byteArrayIn, 0, byteArrayIn.Length);

A ver si eso lo arregla.

Otros consejos

OK, he encontrado el problema, y fue a partir de una parte del código relacionado a la parte del código que me estaba preguntando acerca de.Los datos se pasan como una cadena, que era la conversión a una matriz de bytes (esto fue una plataforma de pruebas por lo que yo estaba tratando de simular la matriz de bytes que me meto en la aplicación principal), a continuación, convertir que a un MemoryStream, a continuación, hacer una Imagen de eso.

Lo que me di cuenta fue de que la cadena fue codificado en Base64.Llamar Convert.FromBase64String() la hizo girar en una matriz de bytes, lo cual no matar a los Image.FromStream() método.

Así que básicamente se reducía a un error estúpido de mi parte.Pero bueno, el código anterior es todavía útil y esta página probablemente sirva como un resultado de Google en cuanto a cómo evitar este error a otra persona.

También, he encontrado una manera fácil de construir un TIFF de varias páginas de mi matrices de bytes aquí.

Todas estas fueron las pistas que me ayudó a entender mi problema que era el mismo problema que el que pide la pregunta.Así que quiero publicar mi solución que llegué a causa de estas pistas útiles.Gracias por todas las pistas publicado hasta el momento!

A medida que el Tiempo Saunders publicado en su respuesta, que el método de Escritura para escribir los bytes de la secuencia de memoria es esencial.Ese fue mi primer error.

A continuación mis datos era malo TIFF de datos también, pero en mi caso, tenía un carácter adicional 13 al comienzo de los datos de mi imagen.Una vez que me quita que, todo funcionó bien para mí.

Cuando leí acerca de algunos conceptos básicos de formato de archivo TIFF especificaciones, me encontré con que los archivos TIFF debe comenzar con II o MM (dos bytes con valores de 73 77).II significa "little-endian" de orden de bytes ("Intel orden de bytes') se utiliza.MM significa gran-final ('Motorola orden de bytes') se utiliza.Los siguientes dos bytes son un número entero de dos bytes valor ( = Int16 en .NET) de 42, binario 101010.

Por lo tanto una correcta TIFF flujo de bytes que comienza con el byte decimal de los siguientes valores:73, 73, 42, 0 o 77, 77, 0, 42.Animo a cualquier persona con el mismo problema que hemos tenido para inspeccionar sus datos TIFF flujo de bytes y asegúrese de que sus datos son válidos datos TIFF!

Gracias Schnapple y Tim Saunders!!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top