为什么PngBitmapEncoder类会让我的图像看起来有颗粒感?

我正在使用此代码将jpg图像转换为png 8.代码可以工作,但图像看起来有颗粒感。 我在Photoshop中导出为png 8,它看起来更平滑,没有颗粒感。

注意 :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); } 

您正在为转换后的图像使用256色的固定调色板。 Photoshop可能使用专门为该图像创建的调色板,并包含所有颜色(或大部分颜色)。

您可以使用抖动 ,或以某种方式生成自定义调色板 ,或两者兼而有之。

更多信息也在这里 。

我发现这个库可以进行基于Palette和基于八叉树的颜色量化。

这篇MSDN文章解释了算法与代码之间的区别。