none
Convertir un TIF con compresión JPEG para poder utilizar el objeto IMAGE RRS feed

  • Pregunta


  • Buenos días,

    llevo un par de días intentando hacerme unas funciones para el tratamiento de distintos tipos de imágenes y no consigo cargar imágenes de tipo tiff con compresión jpeg en el objeto Image de .NET.

    El problema es que al utilizar 

    Image bt = Bitmap.FromFile(@"c:\prueba.tif"); 


    da una excepción de memoria insuficiente. Si el tif no tiene compresion o la compresión es LWZ funciona perfectamente.


    He intentado utilizar también el framewok 3.5 para usar BitmapDecoder pero también me da error al cargar el archivo. No me admite ese formato de pixel me dice.


    ¿Alguien tiene alguna idea de como solucionar eso?

    Me serviría quitar la compresión y despues ya trabajaría  con el otro fichero.


    Un saludo.

    Manu Sánchez
    lunes, 23 de marzo de 2009 12:35

Todas las respuestas

  • hola,

    he encontrado alguans alternativas, puedes probar con algunsod e estos links:

    Encoder.Compression Field

    como veras en el ejemplo este crea un nuevo Bitmap, pero segun vi podrias abrirlo si haces algo como

    Bitmap image = new Bitmap(imagepath)

    o sea si ves la clase Bitmap Class veras que puedes pasarle el path de tu imagen para realizar su apertura, y de alli con esta probar asignarla al control, o usar el Encoder.Compression para transformarla.
     


    TiffBitmapDecoder Class

    podrias usar esta clase por ahi ayude, pero ten en cuenta que sino vi mal esta es una clase de WPF, pero por ahi puede ayudar en la conversion.



    How to convert tiff with jpeg compression to jpeg or tiff with other compression as LZW using C# dot net 1.1?

    por ultimo vi este post que por ahi puede darte una idea de solucion.


    Saludos


    Leandro Tuttini
    lunes, 23 de marzo de 2009 21:28
  • Muchas gracias por la respuesta leandro aunque no me sirva jejeje.

    Las soluciones que me has dado son con las que ya había probado. 

    - Si hago un new Bitmap(path), salta una excepción que es ocasionada porque no lee correctamente la compresión del fichero zip. 

    - Y si utilizo la clase TiffBitmapDecoder salta una excepción distinta que me dice que el formato de los pixeles no está reconocido.

    - Y veo que en los posibles valores del Encoder.Compresion no existe una compresión tipo jpeg.


    Por lo tanto he llegado a la conclusión de que no es posible leer el tipo de dato TIFF con compresión jpeg a través del framework.

    Si alguien tiene otra idea o alguna librería de tratamiento de imagenes open source que me pueda servir para convertir este tipo de imagen a tiff sin compresión o tiff lzw que postee que ya estoy loco jejeje.



    Manu Sánchez
    martes, 24 de marzo de 2009 8:42
  • hola,

    - Cuando usas el Bitmap(path), no entiendo porque dices que no lee correctamente la compresion del fichero zip, o sea el path deberia ser a tu imagen con extension .tiff, no a un zip.
    en caso de que tu imagen este zipeada, primero deberias suar una libreria de descompresion y una vez que tengas la imagen tiff trabajar con ella.
    Hay varias librerias free que permiten trabajar con un .zip.
    Si este es el problema avisa y te recomendamos algunas.


    -  una consulta la imagen si o si debe ser un tiff, o sea no puedes transformala a un jpeg, si pudieras por ahi en el ultimo link esta el codigo para transformar la imagen, esta podria ser una alternativa.

    Aunque por ahi se podria intentar utilizar la opcion de Tiff en la linea : img.Save(retStream, ImageFormat.Jpeg);
    ya que segun veo el ImageFormat permite esta opcion.


    Saludos

    Leandro Tuttini
    martes, 24 de marzo de 2009 23:19
  • Me confundí al poner zip en mi explicación anterior, quería decir tif. 

    A ver, creo que no me he explicado bien así que voy a comentar todo un poco más a fondo.

    Dentro del formato tiff hay varias maneras de comprimir la información. Podemos dejarla sin comprimir, o comprimirla con LZW, zip o jpeg (entre otros).


    El problema es que .NET no reconece el formato de compresión tiff(jpeg), o eso creo. Si  intento hacer: Bitmap.FromFile(@"c:\prueba.tif") de un fichero tiff con compresión jpeg no funciona. Sin enbargo, si esto mismo lo hago con un tiff que no lleve compresión, o que su compresión sea LZW funciona perfectamente.

    Es decir, el problema es que no puedo instanciar un objeto bitmap, image o cualquiera que represente una imagen con este tipo de archivos. Y al no poder instanciar este tipo de objetos no puedo convertir la imagen.

    En cuanto a lo que comentas de que si puedo convertir la imagen a otro formato la respuesta es si, es más, es lo que tengo que lograr hacer pero no se como hacerlo con este formato. Con cualquier otro formato ya sea de tiff, jpg, png o ico el framework va bien pero con este no.

    Espero haberme explicado mejor.

    Un saludo y gracias.






    Manu Sánchez
    miércoles, 25 de marzo de 2009 13:24
  • Algunas ideas que te puedan ayudar:

    1. Este artículo te podría ayudar: Bitonal (TIFF) Image Converter for .NET, http://www.codeproject.com/KB/GDI-plus/BitonalImageConverter.aspx.
    2. PaintDotNet, es un programa .NET, y tiene el soporte para TIFF, quizas en su foro te den ayudas mas puntuales: http://www.getpaint.net/, y si no recuerdo el Paint.Net, era Open Source, y esta disponible el codigo fuente.

    Creo que le primer articulo te pued dar algunas ideas.

    Saludos,
    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    jueves, 26 de marzo de 2009 19:21
  • El primer ejemplo ya lo había visto pero tengo el mismo problema con él. No consigo cargar el tiff.

    La aplicación paint.Net tampoco admite el tipo de fichero tiff con compresión jpeg.

    SIgo buscando....

    Manu Sánchez
    viernes, 27 de marzo de 2009 12:55
  • Como se genera un archivo tiff con compresión Jpg, puedes subir a algun lado para descargar el archivo?

    Saludos,


    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    viernes, 27 de marzo de 2009 13:37
  • Los ficheros que estoy utilizando son confidenciales con lo que no los puedo subir. De todas maneras pesan demaseado para subirlos a algún sitio, sobre 50 megas.

    Lo que si te puedo decir es como generarlos. Yo utilizo la aplicación gratuita xnview para hacer las pruebas. Si tienes cualquier fotografía puedes guardarla como tiff. Al darle a guardar como, abajo a la izquierda aparece un botón con opciones avanzadas. Le das y te salen todas las formas de compresión que existen para los tif. Jpeg es la que da problemas.

    De todas maneras si me dais una dirección de mail o algo os intento generar yo una a partir de una fotografía que ocupe poco.

    El photoshop también tiene la opción de generar este tipo de archivos.

    Muchas gracias...

    Manu Sánchez
    lunes, 30 de marzo de 2009 9:05
  • Por las lecturas que hice, parece que es un tema de Codes y GDI+ (System.Drawing es un encapsulador de las funciones de GDI+, que es implementado en gdiplus.dll).

    Parece que se puede usar en .Net 3.5, pero sobre Windows 7. Aunque la mejor solución sea usar componentes de terceros. Has revisado este componente?: ImageGlue .NET.

    Algunos otros foros sobre el tema:
    1. WPF: TIFF images with JPEG compression?.
    2. TIFF images with JPEG compression?.
    3. TIFF image files that are compressed in the JPEG format cannot be correctly opened by the Office Document Imaging tool in Office 2007 or Office 2003.
    4. How to convert PDF to TIFF through C#?.

    Saludos,


    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    lunes, 30 de marzo de 2009 20:49
  • Antes de nada muchas gracias por la ayuda.

    Todos los foros que me has enviado ya los había revisado jejeje, estuve mucho tiempo con este problema. En cuanto a la explicación es más o menos lo que yo había entendido. Pero pensaba que usando el framework 3.5 ya valía, no sabía que tenía que estar montado sobre un windows diferente del xp.

    Sigo la pista de la aplicación ImageGlue .NET pero esque desde su página me descarga un fichero corrupto y ahora estoy liado con otras cosillas.

    En cuanto saque 5 minutos me pongo con ello y os cuento.

    Un saludo.

    Manu Sánchez
    martes, 31 de marzo de 2009 11:01
  • Que pena dar una idea tan tarde pero bueno ojale les sirva. hay algunas librerías como LibTIFF que prometen soporte para este tipo de compresión pero realmente no lo hacen,  lo que tiene que hacer es utilizar irfanview en un proceso, irfanview permite hacer conversiones entre ella de TIFF JPEG a TIFF LZW o TIFF CCITT FAX 3,  entonces la idea probada es 
    llamar al script de  irfanview  con el parámetro  /tifc=X -  set TIF save compresión : 0 = None, 1 = LZW, 2 = Packbits, 3 = Fax3, 4 = Fax4, 5 = Huffman, 6 = JPG, 7 = ZIP. , esto obviamente con la clase Process  del Framework, espera a que termine el proceso WaitForExit() y abre la imagen convertida. Espero que te sirva.

    Si la respuesta ha sido de utilidad marca la como respuesta correcta.

    • Editado lanetas miércoles, 6 de mayo de 2009 20:49
    miércoles, 6 de mayo de 2009 20:44
  • Duda y al final si lo pudistes rsolver, si lo lograstes me gustaria que me compartieras como lo hicistes gracias
    miércoles, 26 de junio de 2013 16:50
  • Antes de nada muchas gracias por la ayuda.

    Todos los foros que me has enviado ya los había revisado jejeje, estuve mucho tiempo con este problema. En cuanto a la explicación es más o menos lo que yo había entendido. Pero pensaba que usando el framework 3.5 ya valía, no sabía que tenía que estar montado sobre un windows diferente del xp.

    Sigo la pista de la aplicación ImageGlue .NET pero esque desde su página me descarga un fichero corrupto y ahora estoy liado con otras cosillas.

    En cuanto saque 5 minutos me pongo con ello y os cuento.

    Un saludo.

    Manu Sánchez

    Duda y al final si lo pudistes rsolver, si lo lograstes me gustaria que me compartieras como lo hicistes gracias

    miércoles, 26 de junio de 2013 16:51