Hola invitado         31 Jul, 2010 - 07:53
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Utilizar TIFFs con las nuevas clases GDI+ - Actualización (Cesar Chalom) Traduc lecturas 1699
 Enviado por amby en Lunes, 27 Agosto, 2007
Artículos En este caso, Cesar comenta cómo trabajar cuando se cambia la compresión predeterminada que se aplica desde GDI+ a TIFFs.

Utilizar TIFFs con las nuevas clases GDI+ - Actualización

Artículo original: Using TIFFs with the new GDI+ classes - UPDATE
http://weblogs.foxite.com/cesarchalom/archive/2006/09/17/2481.aspx
Autor: Cesar Chalom (http://weblogs.foxite.com/cesarchalom/)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)


Como continuación del artículo de Mayo 2006, publicado en UTMAG bajo el título "Multiframe Images with GDI+" escribí un nuevo artículo en Septiembre 2006 de UTMAG titulado "Using TIFFs with the new GDI+ classes" que muestra cómo manipular imágenes TIFF utilizando la nueva biblioteca GDIPlus-X del proyecto VFP-X. Muestra además cómo crear TIFFs utilizando toda la compresión posible.

Pero debo confesar que tengo un punto aun no muy claro. Me vino después que leí una pregunta de Jennifer Slusher en el foro de Universal Thread (thread ID #1153672), donde preguntaba cómo crear múltiples páginas con compresión 4 (CCITT4). En ese artículo, mostré cómo crear tiffs frecuentes y además, cómo crear un tiff sencillo empleando compresión; pero olvidando mostrar o comentar la creación de tiffs con compresión.

Tiffs de múltiples páginas (multiframe) con compresión

GDI+ de forma predeterminada emplea la compresión LZW cuando se pregunte para guardarlo como TIFF. De acuerdo con Wayne Fulton, desde www.scantips.com, "Sin pérdida significa que no existe ninguna pérdida de calidad debido a la compresión. Garantiza que siempre puede volver a leer exactamente lo que piensa que ha guardado, bits a bits idénticos, sin corrupción de los datos." Por tanto, a menos que lo especifiquemos, GDI+ siempre utiliza compresión LZW en TIFFS

Para crear un TIFF multiframe con compresión diferente a LZW, necesitamos enviar algunos parámetros adicionales a Gdi+, incluso si la imagen original es ya un TIFF con otra compresión. Los métodos "Save" y "SaveAdd" nos permiten enviar más de un parámetro codificado al mismo tiempo. Entonces, todo lo que necesitamos hacer es crear otro objeto cofificador basado en la GUID para la categoría de compresión y hacer su código EncoderValue a la compresión deseada, por ejemplo Compression CCITT4.

El ejemplo que se muestra a continuación preguntará por tres imágenes. Para asegurarse de que será capaz de guardar utilizando cCompression CCITT4, primero va a convertir todas las imágenes seleccionadas a monocromáticas. Luego va a crear un archivo imagen TIFF multiframe que contiene todas las imágenes en CompressionCCITT4.

** El siguiente ejemplo carga tres objetos Bitmap
** Convierte todos los bitmaps en Monochrome para hacerlos compatibles con compresión RLE, CCITT3/4  
** El código guarda las tres imágenes en una sola, un archivo multiple-frame TIFF,
** empleando formato de compresiónCCITT4
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
WITH _SCREEN.System.Drawing
  LOCAL loBmp AS xfcBitmap
  LOCAL loMultif AS xfcBitmap
  LOCAL loPage2 AS xfcBitmap
  LOCAL loPage3 AS xfcBitmap
  LOCAL myEncoder AS xfcEncoder
  LOCAL myCompEncoder AS xfcEncoder
  LOCAL myEncoderParameter AS xfcEncoderParameter
  LOCAL myCompEncoderParameter AS xfcEncoderParameter
  LOCAL myEncoderParameters AS xfcEncoderParameters 

  *!* Crea tres objetos Bitmap.
  *!* Primero cargamos el original Bitmap, 
  *!* y luego su versión monocromática
  loBmp = .Bitmap.New(GETPICT())
  loMultif = loBmp.GetMonochrome()
  loBmp = .Bitmap.New(GETPICT())
  loPage2 = loBmp.GetMonochrome()
  loBmp = .Bitmap.New(GETPICT())
  loPage3 = loBmp.GetMonochrome()

  *!* Libera el Bitmap original porque no lo vamos a emplear más
  loBmp = NULL

  && Crea el objeto Encoder basado en GUID para el SaveFlag parámetro categoría.
  myEncoder = .Imaging.Encoder.SaveFlag 

  && Crea el objeto Encoder object basado en GUID para el parámetro Compression categoría.
  myCompEncoder = .Imaging.Encoder.Compression 

  && Crea un objeto EncoderParameters.
  && El objeto EncoderParameters tiene una matriz de objetos EncoderParameter 
  && En este caso, habrá 2 objetos EncoderParameter en la matriz.
  myEncoderParameters = .Imaging.EncoderParameters.New(2)

  *!* Guarda la primera página (marco).
  myEncoderParameter = .Imaging.EncoderParameter.New(myEncoder, ;
    .Imaging.EncoderValue.MultiFrame)
  myCompEncoderParameter =.Imaging.EncoderParameter.New(myCompEncoder, ;
    .Imaging.EncoderValue.CompressionCCITT4)
  myEncoderParameters.Param[1] = myEncoderParameter
  myEncoderParameters.Param[2] = myCompEncoderParameter 
  loMultif.Save("c:\NewMultiframeCompress.tif", ;
    .Imaging.ImageFormat.Tiff, myEncoderParameters)

  *!* Guarda la segunda página (marco).
*!* Esta vez solamente cambiaremos el primer parámetro a "FrameDimensionPage" *!* El segundo parámetro establece la compresión se va a mantener el mismo myEncoderParameter = .Imaging.EncoderParameter.New(myEncoder, ; .Imaging.EncoderValue.FrameDimensionPage) myEncoderParameters.Param[1] = myEncoderParameter loMultif.SaveAdd(loPage2, myEncoderParameters) *!* Guarda la tercera página (marco). *!* Esta vez no necesitamos hacer ningún cambio en los parámetros *!* Nos mantendremos utilizando los mismos parámetros utilizados cuando agregamos el 2do marco loMultif.SaveAdd(loPage3, myEncoderParameters) *!* Cierra el archivo multiple-frame. *!* Esta vez llamamos al parámetro "Flush" para cerrar el archivo. *!* No volveremos a necesitar el segundo parámetro, así que lo cambiamos a NULL myEncoderParameter = .Imaging.EncoderParameter.New(myEncoder, ; .Imaging.EncoderValue.Flush) myEncoderParameters.Param[1] = myEncoderParameter myEncoderParameters.Param[2] = NULL loMultif.SaveAdd(myEncoderParameters) ENDWITH RETURN

La parte más importante del código anterior está a continuación:

&& Crea un objeto Encoder basado en GUID para el parámetro SaveFlag category.
myEncoder = .Imaging.Encoder.SaveFlag
&& Crea el objeto Encoder object basado en GUID para el parámetro Compression categoría.
myCompEncoder = .Imaging.Encoder.Compression 
&&  Crea un objeto EncoderParameters.
&& El objeto EncoderParameters tiene una matriz de objetos EncoderParameter
&& En este caso, habrá 2 objetos EncoderParameter en la matriz.
myEncoderParameters = .Imaging.EncoderParameters.New(2)
*!* Guarda la primera página (marco).
myEncoderParameter = .Imaging.EncoderParameter.New(myEncoder, ;
  .Imaging.EncoderValue.MultiFrame)
myCompEncoderParameter =.Imaging.EncoderParameter.New(myCompEncoder, ;
  .Imaging.EncoderValue.CompressionCCITT4)
myEncoderParameters.Param[1] = myEncoderParameter
myEncoderParameters.Param[2] = myCompEncoderParameter

Vea que el objeto MyEncoderParameters contiene una propiedad "Params" que es una matriz de parámetros.

¡ Espero que esto sea útil !

OTROS ENLACES RELACIONADOS

TIFF, Tag Image File Format, FAQ http://www.awaresystems.be/imaging/tiff/faq.html

A few scanning tips http://www.scantips.com/basics9t.html


 Versión imprimible  
Utilizar TIFFs con las nuevas clases GDI+ - Actualización (Cesar Chalom) Traduc | Entrar/Crear una cuenta | 0 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.



Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.