2009-06-03 12 views
4

このコードを使用してjpgイメージをpng 8に変換しています。 コードは機能しますが、イメージは粒状に見えます。私はPhotoshopでpng 8として書き出しを行いました。滑らかで穀物は見えません。PngBitmapEncoderクラスで画像が粗く見えるのはなぜですか?

:そこにそれを助けることができる8ビットのPNG

任意の画像達人?

マイコード:

Image ImageFile = Image.FromFile(@"C:\Documents and Settings\dvela\My Documents\Downloads\pngtest\Batman01.jpg"); 
Rectangle NewSize = new Rectangle(); 
NewSize.Width = 112; 
NewSize.Height = (NewSize.Width * ImageFile.Height)/ImageFile.Width; 

Bitmap image = new Bitmap(NewSize.Width, NewSize.Height); 

Graphics graphics = Graphics.FromImage(image); 
graphics.CompositingQuality = CompositingQuality.HighQuality; 
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
graphics.SmoothingMode = SmoothingMode.HighQuality; 

graphics.DrawImage(ImageFile, NewSize); 

FormatConvertedBitmap fcb = new FormatConvertedBitmap(System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(image.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(NewSize.Width, NewSize.Height)), PixelFormats.Indexed8, BitmapPalettes.Halftone256Transparent, 0.5); 

PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder(); 
pngBitmapEncoder.Interlace = PngInterlaceOption.Off; 
pngBitmapEncoder.Frames.Add(BitmapFrame.Create(fcb)); 

using (Stream fileStream = File.Open(@"C:\Documents and Settings\dvela\My Documents\Downloads\pngtest\test.png", FileMode.Create)) 
{ 
    pngBitmapEncoder.Save(fileStream); 
} 
+0

両方の画像を投稿したり、そのバージョンを切り取ることはできますか? –

答えて

1

パレットベースおよびオクトリーベースの色量子化を行うthis libraryが見つかりました。

このMSDN articleは、コードとアルゴリズムの違いについて説明しています。

+0

ほとんどのリンクが壊れています –

+0

リンクを更新しました。マイクロソフトは、リンクを生かし続けるという恐ろしい仕事をしていることで有名です。そのため、Web Archiveへのリンクがあります。 –

3

あなたは、変換後の画像のための256色の固定パレットを使用しています。 Photoshopはおそらく、その画像用に特別に作成されたパレットを使用し、そのすべての色(またはそのほとんど)を含みます。

ditheringを使用するか、何らかの形でcustom palette、またはその両方を生成できます。

さらに詳しい情報はhereです。

+0

私はPhotoshopのカラーテーブルとそこでの色テーブルを比較しました。カスタムパレットを作成できるライブラリはありますか? –

+0

私はC#をまったく知らないので、これでお手伝いできません。 – cube

+0

+1私に正しい方向を向けると私に正しいverbageを与えるので、私は私の答えを見つけることができました。 –

関連する問題