2013-07-10 2 views
0

Я обрабатываю текст (используя TextRenderer.DrawText) на растровом изображении, которое было обрамлено белым (Color.White) с использованием метода FillRectangle. я тогда TransparentBlt этот Bitmap на память-DC, включая красочный фон изображение, используя значения RGB Color.White And &HFFFFFF в качестве прозрачного цвета (в crTransparent аргумент), следующим образом:TransparentBlt создает нечеткое изображение

TransparentBlt(hDestMemDc, 0, 0, iTextWidth, iTextHeight, hTextMemDc, 0, 0, iTextWidth, iTextHeight, Color.White.ToArgb() And &HFFFFFF) 

{Я тогда BitBlt комбинированное изображение на моем Контрольном поверхность, но это не так актуальна}

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

Вот снимок текста, оказываемых на белом фоне (это изображение и не набранный текст):

enter image description here

И это результат Транс-блиттинг изображение выше над красочным фоном:

enter image description here

Пожалуйста, обратите внимание, что белый (будущие) точки по-прежнему окружают красный текст.

Кроме того, обратите внимание на вертикальную вертикальную линию, обращенную влево от изображения, и аналогичную более короткую горизонтальную линию, нарисованную в правом верхнем углу.

Я использую VB.NET 2005 (a.k.a VB8). Ваш совет будет очень оценен.

+0

Похоже, что сглаживание шрифтов. Как вы визуализируете текст? – HerrJoebob

+0

oGraphics.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality oGraphics.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic oGraphics.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality oGraphics.TextContrast = 0 oGraphics.TextRenderingHint = Drawing.Text .TextRenderingHint.AntiAlias ​​ – Bliss

+0

'дим sRect Как Прямоугольник = Новый прямоугольник (0, 0, m_sTextSize.Width, m_sTextSize.Height)' ' дим oBrush Как кисть = Новый SolidBrush (const_sTextBackColor)' 'oGraphics.FillRectangle (oBrush, sRect) ' ' TextRenderer.DrawText (oGraphics, Me.Text, Me.Font, sRect, Me.ForeColor, const_sTextBackColor, m_eTextFormatFlags) ' Если это действительно причина, то как результат рендеринга (верхнее изображение) острый? – Bliss

ответ

2

Сглаживание текста/ClearType означает, что не весь текст отображается в одном цвете. Внешние пиксели текста смешиваются с цветом фона, на котором они нарисованы, что приводит к сглаживанию краев. Из-за этого вы не можете отображать текст на одном цвете фона, вырезать его и ожидать, чтобы он выглядел как хороший против другого фона.

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

Вместо этого вы должны сделать копию окончательного целевого растрового изображения в памяти, отобразить текст над этим, а затем снова включить его обратно на экран.

+0

Первое - спасибо за воспитательный ответ. Он обязан. Я не упоминал об этом, это текстовый скроллер. Я использую blitting как более эффективный с точки зрения ЦП подход. Если бы мне пришлось отображать текст каждые 20 [mSec] на один пиксель, я бы потерял преимущества использования процессора blitting (и я попробовал). Есть идеи? – Bliss

+0

Вы можете попробовать использовать прозрачное окно (то есть созданное с помощью WS_EX_LAYERED и обновленное с помощью 'UpdateLayeredWindow'), а затем визуализировать текст напрямую, но вам все равно нужно повторно рисовать текст каждый раз. Или попробуйте двухслойные окна, как ширину экрана, так и затем переместите сами окна, чтобы получить эффект прокрутки, но опять же я не знаю, будет ли это лучше с точки зрения использования ЦП. –

+0

Является ли разница в производительности (CPU-usage) ожидаемой между текстовым рендером в функции обработчика событий OnPaint' (косвенно вызываемой вызовом 'Refresh()' на каждом тике по таймеру) и текстовым рендерингом в таймер- сам обработчик галочки (который впоследствии также смешивает результат с поверхностью управления)? – Bliss

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