2010-12-23 10 views
6

Cuando giro una imagen, .Net cambia la codificación tiff. ¿Hay alguna manera de mantener el CCITT Fax 4 (codificación de fax grupal 4) y no tener que cambiar a LZW? Así es como estoy rotando una imagen en el disco..Net Image.Guardar cambios tiff de CTTIT Fax 4 a LZW

System.Drawing.Image img = System.Drawing.Image.FromFile(input); 
//rotate the picture by 90 degrees 
img.RotateFlip(RotateFlipType.Rotate90FlipNone); 
img.Save(input, System.Drawing.Imaging.ImageFormat.Tiff); 

Gracias, Brian

Actualización: Aquí está el código basado en los artículos vinculados a continuación. Quería agregar el código aquí para completenes. Además, establezco la resolución horizontal porque los mapas de bits son predeterminados a 96 DPI.

//create an object that we can use to examine an image file 
System.Drawing.Image img = System.Drawing.Image.FromFile(input); 

//rotate the picture by 90 degrees 
img.RotateFlip(RotateFlipType.Rotate90FlipNone); 

// load into a bitmap to save with proper compression 
Bitmap myBitmap = new Bitmap(img); 
myBitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution); 

// get the tiff codec info 
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/tiff"); 

// Create an Encoder object based on the GUID for the Compression parameter category 
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Compression; 

// create encode parameters 
EncoderParameters myEncoderParameters = new EncoderParameters(1); 
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, (long)EncoderValue.CompressionCCITT4); 
myEncoderParameters.Param[0] = myEncoderParameter; 

// save as a tiff 
myBitmap.Save(input, myImageCodecInfo, myEncoderParameters); 

// get encoder info for specified mime type 
private static ImageCodecInfo GetEncoderInfo(String mimeType) 
{ 
    int j; 
    ImageCodecInfo[] encoders; 
    encoders = ImageCodecInfo.GetImageEncoders(); 
    for (j = 0; j < encoders.Length; ++j) 
    { 
     if (encoders[j].MimeType == mimeType) 
      return encoders[j]; 
    } 
    return null; 
} 

Respuesta

6

La clase de imagen no le proporcionará los controles granulares necesarios.

Para hacer esto, necesitará leer en un mapa de bits, crear un codificador TIFF, establecer el parámetro para el tipo de compresión y luego hacer que el objeto Bitmap guarde la imagen usando ese códec y parámetro.

He aquí un ejemplo que debería llevar la dirección correcta:

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.compression.aspx

que no tienen VS abierta, en mi Mac en este momento.

Aquí hay más detalles:

http://social.msdn.microsoft.com/Forums/en/windowswic/thread/e05f4bc2-1f5c-4a10-bd73-86a676dec554

+0

Gracias que trabaja. Sin embargo, está cambiando el DPI de 300 a 96. ¿Alguien sabe cómo configurarlo? – BrianK

+0

Creo que la clase de imagen lo admite (al menos funciona para mí). Por lo tanto, no es necesario tener el mapa de bits adicional, y como bonificación adicional, no hay necesidad de perder la resolución. – user12861

+0

BrianK: Bitmap.SetResolution() lo hará, (¡aunque esto probablemente no lo ayude 2 años después!) – user20493