2011-01-31 2 views
4

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

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

Создание растрового изображения с фоном на основе существующего 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

+2

Созданное изображение действительно выглядит так, как я ожидаю от кода, который у вас есть. Можете ли вы рассказать о том, что вы подразумеваете под «плохим» качеством? это сглаживание, это проблема? Проблемы с цветом? Артефакты сжатия? Не стесняйтесь показывать масштабные изображения или помечать фрагменты изображения в виде представлений. – ctacke

+0

Для меня качество не до нуля. Например, фон, используемый, например, используется в другом месте на веб-странице (где показан этот график), но очень заметно, что фон графика имеет более низкое качество – Chris

+0

из любопытства, какие обстоятельства приводят к созданию изображений для веб-страницу с использованием CF? Веб-серверы обычно не сдерживаются ... –

ответ

5

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

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

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

Чтобы избежать компрессионных артефактов, вы можете управлять параметрами сжатия jpeg, вручную управляя сжатием, а не используя (невысокое качество) по умолчанию ImageFormat.Jpeg - к сожалению, делать это на CF невозможно, не прибегая к ручному P/Invoking или третьему партийной библиотеки. Для более обширного примера кода для полной .NET Framework см. Ответ, который я написал на аналогичный вопрос: How do you conver a HttpPostedFileBase to an Image?.

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

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

+0

Отличный ответ, но, к сожалению, он не работает с компактным каркасом! – Chris

+0

Я добавил несколько вариантов CF, хотя, думаю, Png - ваш лучший выбор. –

1

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

+0

Нет дополнительных опций, кроме того, что я указываю – Chris

+0

. Я не знал, что в компактной структуре не поддерживается кодирование.Я не совсем уверен, а потом сожалею :( – asawyer

0

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

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

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

+0

К сожалению, эти опции недоступны в компактном каркасе – Chris

+0

компактный каркас отстой, например – FrostyFire

2

Вы не сказали, что плохого качества. Есть ли видимые артефакты JPEG? Являются ли цвета неправильными? Являются ли линии зубчатыми?

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

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

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

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

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

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

+0

Я считаю, что это в основном артефакты jpeg, я обновлю свой вопрос с изображением. – Chris

+0

PNG определенно улучшает качество по сравнению с JPEG, но недостаточно для того, что я получаю после – Chris

Смежные вопросы