2010-12-23 9 views
6

Wenn ich ein Bild rotiere, schaltet .Net die tiff-Codierung um. Gibt es eine Möglichkeit, das CCITT Fax 4 (Gruppe 4 Fax-Codierung) zu behalten und nicht auf LZW umzustellen? Hier ist, wie ich ein Bild auf der Festplatte rotiere..Net Image.Save ändert tiff von CTTIT Fax 4 auf 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); 

Danke, Brian

Update: Hier ist der Code auf der Grundlage des Artikel zu unten verlinkt. Ich wollte den Code hier für Compleynes hinzufügen. Außerdem stelle ich die horizontale Auflösung ein, da die Bitmaps standardmäßig auf 96 DPI eingestellt sind.

//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; 
} 

Antwort

6

Die Image-Klasse wird Ihnen nicht die notwendigen granularen Steuerelemente geben.

Um dies zu tun, müssen Sie in ein Bitmap lesen, einen TIFF-Encoder erstellen, den Parameter für den Komprimierungstyp festlegen und dann das Bitmap-Objekt das Bild mit diesem Codec und Parameter speichern.

Hier ist ein Beispiel, das Sie in die richtige Richtung führen sollte:

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

Ich habe keine VS offen, auf meinem Mac im Moment.

Hier sind weitere Details:

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

+0

Dank, das funktioniert. Es ändert jedoch die DPI von 300 auf 96. Weiß jemand, wie man es einstellt? – BrianK

+0

Ich denke, die Bildklasse unterstützt dies (zumindest funktioniert es für mich). Sie brauchen also keine zusätzliche Bitmap, und als zusätzlichen Bonus müssen Sie sich nicht mit der Auflösung herumärgern. – user12861

+0

BrianK: Bitmap.SetResolution() wird es tun, (obwohl das dir wahrscheinlich 2 Jahre später nicht helfen wird!) – user20493