Качество .NET CF Bitmap класса низкое - PullRequest
4 голосов
/ 31 января 2011

У меня есть код, который создает график с использованием класса Bitmap. Однако качество получаемого растрового изображения довольно низкое, как я могу улучшить его качество? Обратите внимание, что я использую Compact Framework!

Вот несколько фрагментов того, как я делаю разные вещи:

Создание растрового изображения с фоном на основе существующего JPG

Bitmap bitmap = new Bitmap(filename);

Затем я создаю Graphics класс из растрового изображения

Graphics myG = Graphics.FromImage(bitmap);

Затем я рисую графику так:

myG.DrawLine(majorAxisPen, graphRect.Left, graphRect.Bottom, graphRect.Right, graphRect.Bottom);

После рисования всего, что мне нужно, я сохраняю Bitmap примерно так:

bitmap.Save(fileDestination, System.Drawing.Imaging.ImageFormat.Jpeg);

Вот изображение, которое оно производит Poor quality image

Ответы [ 4 ]

5 голосов
/ 31 января 2011

Есть два источника "низкого качества", с которыми вы можете столкнуться.

  1. Фактический рисунок к графическому объекту может быть низкого качества - то есть линии, которые вы рисуете, могут быть наложены (пикселированы).
  2. Низкое качество может быть побочным эффектом jpegкодирование при выводе графики в поток.

Каждый объект Graphics обладает рядом свойств, которые контролируют «качество» операций, которые вы можете выполнять над объектом.В частности, вы должны установить SmoothingMode на HighQuality, чтобы избежать зазубрин на линейных чертежах. Не поддерживается в .NET Compact Framework .

Чтобы избежать артефактов сжатия, вы можете управлять параметрами сжатия jpeg, управляя сжатием вручную, а не по умолчанию (низкого качества)ImageFormat.Jpeg - к сожалению, сделать это на CF невозможно без обращения к ручному P / Invoking или сторонней библиотеке.Более подробный пример кода для полной .NET Framework см. В ответе, который я написал на аналогичный вопрос: Как преобразовать HttpPostedFileBase в изображение? .

Простая альтернативаиспользовать PNG, формат изображения без потерь, который не ухудшает качество при каждом сохранении - учитывая простые геометрические формы приведенного вами примера, это даже не будет стоить вам ничего с точки зрения размера файла.Использование другого формата может быть единственным вариантом;настройка параметров jpeg-кодировщика невозможна в Compact Framework, поскольку ImageCodecInfo недоступен.Если вам действительно нужен Jpeg, вы можете попытаться использовать внешнюю библиотеку (например, http://www.opennetcf.com/library/sdf/), или собственные методы P / Invoke для прямого доступа к платформенным кодировщикам.

Некоторые возможные подходы для сглаживания:

2 голосов
/ 31 января 2011

Вы не сказали, что плохого в качестве. Есть ли видимые артефакты JPEG? Цвета неправильные? Линии неровные?

Не зная, в чем конкретно заключается проблема, трудно найти решение.

Некоторые возможные проблемы / решения:

Линии неровные: используйте Graphics.SmoothingMode, чтобы указать способ визуализации линий.

Линии неровные: используйте формат сжатия, подходящий для штриховой графики: JPEG не подходит для штриховой графики, GIF и PNG.

Существуют артефакты сжатия: повторное сжатие уже сжатой (JPEG) графики не рекомендуется. Если у вас есть несжатый исходный образ, вместо этого используйте его в качестве основы.

Существуют артефакты сжатия: укажите уровень JPEG с меньшими потерями или используйте тип сжатия без потерь, например, GIF или PNG.

1 голос
/ 31 января 2011

На первый взгляд, я бы сказал, проверьте опции, доступные в вызове Save, я думаю, что вы можете указать значение качества Jpeg, чтобы использовать более высокое, или вы можете переключиться на сжатие без потерь, например PNG, там.

0 голосов
/ 31 января 2011

Попробуйте поэкспериментировать с качеством графики:

graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

По моему опыту, самое низкое приемлемое качество - сравнительно небольшой файл. Разница в качестве изображения между 90% и 100% невидима, но файл будет в 5 раз меньше при 90%.

...