图形转动锐利/像素化的原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图形转动锐利/像素化的原因相关的知识,希望对你有一定的参考价值。

我让组合框画出这样的字体名称:

Private Sub cboFontName_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles cboFontName.DrawItem

    e.DrawBackground()
    If (e.State And DrawItemState.Focus) <> 0 Then
        e.DrawFocusRectangle()
    End If
    Dim objBrush As Brush = Nothing
    Try
        If e.Index > -1 Then
            objBrush = New SolidBrush(e.ForeColor)
            Dim sFontName As String = Me.cboFontName.Items(e.Index).ToString
            Dim nFont As Font = Nothing
            Dim nFontFamily = New FontFamily(sFontName)
            If nFontFamily.IsStyleAvailable(FontStyle.Regular) Then
                nFont = New Font(nFontFamily, 14, FontStyle.Regular)
            ElseIf nFontFamily.IsStyleAvailable(FontStyle.Bold) Then
                nFont = New Font(nFontFamily, 14, FontStyle.Bold)
            ElseIf nFontFamily.IsStyleAvailable(FontStyle.Italic) Then
                nFont = New Font(nFontFamily, 14, FontStyle.Italic)
            End If
            e.Graphics.DrawString(sFontName, nFont, objBrush, e.Bounds)
        End If
    Finally
        If objBrush IsNot Nothing Then
            objBrush.Dispose()
        End If
        objBrush = Nothing
    End Try

End Sub

它一直很好,但现在(我不知道我改变了什么),字体渲染锐利/像素化:

左边是它之前的变化(漂亮而流畅),右边是当前的像素化版本。

enter image description here

此外,一些第三方控件突然呈现像素化,因此它似乎是一个应用程序范围的效果。我无法控制这些第三方控件如何呈现文本。

我真的不知道是什么导致了这一点。

这是什么原因?

我打电话的时候

    e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias

......它再次顺利,但我确实发誓我以前没必要这样做。我现在才发现它。

ps:右边的屏幕截图来自一个沙盒Windows,我在那里运行了旧的版本,所以不要对不同的滚动条外观感到惊讶。它曾经在非沙盒Windows上运行良好。

以下是我在Windows设置中禁用ClearType时的外观:enter image description here

答案

我找到了罪魁祸首:

出于某种原因,此行导致此行为:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias

但我不知道为什么这样做导致像素化错误,并且在所有其他形式中也是如此,尽管我不在其他形式中使用此代码。

具体来说,我在下面的代码中使用它。当我注释掉“g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias”这一行时,一切正常。

Public Sub DrawTextWEx(ByRef uBitmap As Bitmap, ByVal uText As String, ByVal uColor As Color, ByVal uStringFormat As StringFormat, ByRef uFont As Font, ByRef uAvailableRect As Rectangle)

    Using g As Graphics = Graphics.FromImage(uBitmap)
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias
        Using nBrush As New System.Drawing.SolidBrush(uColor)
            g.DrawString(uText, uFont, nBrush, uAvailableRect, uStringFormat)
        End Using
    End Using

End Sub

以上是关于图形转动锐利/像素化的原因的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 输出像素化的圆圈到控制台。对图形或Minecraft有用。

从代码(PaintCode)绘制的视图是像素化的,缩放时非常像素化

OpenGL:基本图形绘画二

渲染管道光栅阶段一“总览”

渲染管道光栅阶段一“总览”

计算机图形学——直线扫描转换