2012-04-12 10 views
0

Ich muss eine TIFF-Datei, die in schwarz und weiß Farben zu PNG mit .net konvertieren. aber ich kann die Farbtiefe nicht auf 8 Bit pro Pixel reduzieren. Es gibt die Datei immer in 24 Bit pro Pixel aus. Gibt es eine Möglichkeit, dies in .net zu tun? oder eine Open-Source-Managed-Library dazu?Konvertieren Sie eine TIFF-Datei in ein PNG-Format von 8 Bit pro Pixel. NET

code ich benutze.

public bool convertTiffToJpg(string sourceFile, string targetFile) 
     { 

      bool response = false; 

      try 
      { 

       // Get individual Images from the original image 
       Image sourceImage = Bitmap.FromFile(sourceFile); 

       var total = sourceImage.GetFrameCount(FrameDimension.Page); 
       var pageNumbers = Enumerable.Range(0, total).ToArray(); 
       Image[] sourceImages = new Image[pageNumbers.Length]; 
       for (int i = 0; i < pageNumbers.Length; i++) 
       { 
        sourceImage.SelectActiveFrame(FrameDimension.Page, pageNumbers[i]); 
        float width = sourceImage.Width; 
        float height = sourceImage.Height; 
        ResizeImage(1000, sourceImage.Height, ref width, ref height); 

        using (var returnImage = new Bitmap(sourceImage, (int)width, (int)height)) 
        { 
         using (MemoryStream ms = new MemoryStream()) 
         { 
          returnImage.Save(ms, ImageFormat.Jpeg); 
          sourceImages[i] = Image.FromStream(ms); 
         } 
        } 
       } 

       // Merge individual Images into one Image 
       var totalHeight = sourceImages.FirstOrDefault().Height * total; 
       var totalWidth = sourceImages.FirstOrDefault().Width; 
       using (var finalImage = new Bitmap(totalWidth, totalHeight)) 
       { 
        using (var g = Graphics.FromImage(finalImage)) 
        { 
         // All other pages 
         for (int i = 0; i < pageNumbers.Length; i++) 
         { 
          g.DrawImage(sourceImages[i], new Point(0, sourceImages[i].Height * i)); 
         } 
        } 
         ImageCodecInfo Codec = ImageCodecInfo.GetImageEncoders().Where(codec => codec.FormatID.Equals(ImageFormat.Png.Guid)).FirstOrDefault(); 

         finalImage.Save(targetFile, Codec, GetCodedParams(50)); 
       } 

       response = true; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 

      return response; 
     } 

private EncoderParameters GetCodedParams(int? quality) 
     { 
      var imageQuality = quality ?? 80; 
      EncoderParameter ratio = new EncoderParameter(Encoder.Quality, imageQuality); 
      EncoderParameter light = new EncoderParameter(Encoder.ColorDepth, 8L); 
      EncoderParameters codecParameters = new EncoderParameters(2); 
      codecParameters.Param[0] = ratio; 
      codecParameters.Param[1] = light; 
      return codecParameters; 
     } 

aber noch bin ich nicht in der Lage png von 8-Bit-Tiefe zu erhalten.

Grüße.

+0

Mögliche Duplikat http://stackoverflow.com/questions/483014/generate-image-file-with-low-bit-depths – pstrjds

+0

ich habe überprüfte die Post, aber es funktioniert auch nicht –

Antwort

0

Das ist, was ich habe. Ich habe Bild-Quantisierung verwendet, um die Farbtiefe zu reduzieren.

http://msdn.microsoft.com/en-us/library/aa479306.aspx das ist es ich den Quantisierer bekam

public bool convertTiffToPng(string sourceFile, string targetFile) 
     { 

      bool response = false; 

      try 
      { 

       // Get individual Images from the original image 
       Image sourceImage = Bitmap.FromFile(sourceFile); 

       var total = sourceImage.GetFrameCount(FrameDimension.Page); 
       var pageNumbers = Enumerable.Range(0, total).ToArray(); 
       Image[] sourceImages = new Image[pageNumbers.Length]; 
       for (int i = 0; i < pageNumbers.Length; i++) 
       { 
        sourceImage.SelectActiveFrame(FrameDimension.Page, pageNumbers[i]); 
        float width = sourceImage.Width; 
        float height = sourceImage.Height; 
        ResizeImage(1024, sourceImage.Height, ref width, ref height); 

        using (var returnImage = new Bitmap(sourceImage, (int)width, (int)height)) 
        { 
         using (MemoryStream ms = new MemoryStream()) 
         { 
          returnImage.Save(ms, ImageFormat.Jpeg); 
          sourceImages[i] = Image.FromStream(ms); 
         } 
        } 
       } 
       var p = new System.Collections.ArrayList(); 
        p.Add(Color.Black); 
        p.Add(Color.Gray); 
        p.Add(Color.LightGray); 
        p.Add(Color.DarkGray); 
        p.Add(Color.White); 
        PaletteQuantizer quantizer = new PaletteQuantizer(p); 
        //OctreeQuantizer quantizer = new OctreeQuantizer(2,2); 

       // Merge individual Images into one Image 
       var totalHeight = sourceImages.FirstOrDefault().Height * total; 
       var totalWidth = sourceImages.FirstOrDefault().Width; 
       using (var finalImage = new Bitmap(totalWidth, totalHeight)) 
       { 

        using (var g = Graphics.FromImage(finalImage)) 
        { 
         g.InterpolationMode = InterpolationMode.Low; 
         g.PixelOffsetMode = PixelOffsetMode.HighSpeed; 

         // All other pages 
         for (int i = 0; i < pageNumbers.Length; i++) 
         { 
          g.DrawImage(sourceImages[i], new Point(0, sourceImages[i].Height * i)); 
         } 
        } 

        //finalImage.MakeTransparent(Color.White); 
        using (var toout = quantizer.Quantize(finalImage)) 
        { 
         ImageCodecInfo Codec = ImageCodecInfo.GetImageEncoders().Where(codec => codec.FormatID.Equals(ImageFormat.Png.Guid)).FirstOrDefault(); 
         toout.Save(targetFile, Codec, GetCodedParams(null)); 
        } 

       } 

       response = true; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 

      return response; 
     } 
+1

Warum konvertieren Sie von Tiff (ich würde eine Gruppe 4 Tiff, da es schwarz und weiß ist) zu einem JPEG (das ist eine verlustbehaftete Komprimierung) vor dem Schreiben aller Seiten auf Ihre PNG. Ich weiß auch nicht, was Ihre ResizeImage tut, aber von einem flüchtigen Blick auf den Code scheint es, als ob Sie davon ausgehen, dass alle Seiten im Tiff die gleiche Größe haben. Ich kenne nicht die Domäne, in der Sie dies verwenden, aber Tiffs können Seiten unterschiedlicher Größe haben (gehen Sie zu einem Recorder von Ordnungsamt und greifen Sie einige Tiffs, viele Male haben sie Seiten der legalen Größe, 8,5 x 11, und riesige Eigentumsplatten in die gleiche Datei) – pstrjds

+0

Ja Tiffs sind in schwarz und weiß mit der gleichen Seitengröße für alle Frames, ich brauche nur ein Png-Format, nur weil ich will, dass sie in silverlight Anwendung angezeigt werden (die TIFF nicht unterstützen) zuerst versuchte ich zu konvertieren Tiff in JPEG und wie Sie sagten, es ist eine schreckliche Option, weil JPEGs entworfen sind, um mehr Farben zu verwenden und seine Kompression passt am besten für farbige Bilder. dann bin ich mit png Option übrig. da ich weiß, dass tiff keine 24bit-farbtiefe haben muss, habe ich versucht, ihre farbtiefe auf 8bit zu reduzieren und die palettenquantisierung genutzt, um die farben auf nur schwarz und weiß zu reduzieren. –

+0

Ich möchte auch wissen, ob ich weiße Farbe zu transparent von Png machen kann, da die meisten Dokumente weißen Hintergrund verwenden. und wie stark wird es die png filesize beeinflussen? –

Verwandte Themen