Почему класс PngBitmapEncoder делает мои изображения зернистыми? - PullRequest
4 голосов
/ 03 июня 2009

Я использую этот код для преобразования изображения 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);
}

Ответы [ 2 ]

3 голосов
/ 03 июня 2009

Вы используете фиксированную палитру с 256 цветами для преобразованного изображения. Вероятно, Photoshop использует палитру, созданную специально для этого изображения и содержащую все его цвета (или большинство из них).

Вы можете использовать дизеринг или как-то сгенерировать пользовательскую палитру , или и то и другое.

дополнительная информация также здесь .

1 голос
/ 03 июня 2009

Я нашел эту библиотеку , которая выполняет квантование цветов на основе палитры и октри.

Эта статья MSDN объясняет разницу между алгоритмами с кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...