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
|