2012-04-12 4 views
0

흑백을 사용하는 tiff 파일을 .net을 사용하여 png로 변환해야합니다. 하지만 픽셀 당 8 비트로 색상 깊이를 줄일 수 없습니다. 그것은 항상 픽셀 당 24 비트로 파일을 출력합니다. 내가 .net에서 이것을 할 수있는 방법이 있습니까? 또는 오픈 소스 Managed library에서 그렇게 할 수 있습니까?TIFF 파일을 픽셀 당 8 비트의 png 형식으로 변환하십시오.

코드를 사용하고 있습니다.

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

그러나 여전히 8 비트 깊이의 png를 얻을 수 없습니다.

감사합니다.

+0

가능한 중복 http://stackoverflow.com/questions/483014/generate-image-file-with-low-bit-depths – pstrjds

+0

을 가지고있다 게시물을 확인했지만 작동하지 않습니다 –

답변

0

이것은 내가 생각해내는 것입니다. 나는 색 심도를 줄이기 위해 Image Quantization을 사용했다.

http://msdn.microsoft.com/en-us/library/aa479306.aspx 이 내가 가지고있는 양자화의

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

PNG에 모든 페이지를 작성하기 전에 Tiff (흑백이기 때문에 Group 4 Tiff로 가정)에서 JPEG (손실 압축)로 변환하는 이유는 무엇입니까? 또한 귀하의 ResizeImage가 무엇인지 모르겠지만, 당신이 Tiff의 모든 페이지가 같은 크기라고 가정하는 것처럼 보이는 코드의 섬세한 부분에서. 나는 당신이 이것을 사용하고있는 도메인을 모른다. 그러나 Tiff 's는 다른 사이즈의 페이지를 가질 수있다. (증서 사무실의 기록부에 가서 어떤 티파니를 잡아라, 그들은 법적인 크기의 페이지를 가지고있다. 동일한 파일) – pstrjds

+0

예 tiffs는 모든 프레임에 대해 동일한 페이지 크기를 갖는 흑백으로되어 있습니다. 왜냐하면 실버 프레임 응용 프로그램 (tiff를 지원하지 않음)에 표시되기를 원하기 때문에 png 형식이 필요합니다. 먼저 변환하려고했습니다. jpeg가 더 많은 색상을 사용하도록 설계되어 있고 압축률이 컬러 이미지에 가장 적합하기 때문에 jpeg에서 tiff를 사용하는 것은 끔찍한 옵션입니다. 그럼 난 png 옵션이 남아있다. 나는 tiff가 24bit color depth를 가질 필요가 없다는 것을 알고 있기 때문에 color depth를 8bit로 줄이기 위해 노력했고 색상을 흑백으로 줄이기 위해 팔레트 양자화를 사용했습니다. –

+0

나는 또한 대부분의 문서가 흰색 배경을 사용하므로 흰색을 PNG로 투명하게 만들 수 있는지 알고 싶습니다. 얼마나 많은 PNG 파일 크기에 영향을 미칠 것입니까? –

관련 문제