4

GDI+ を使用して、黒で縁取られた白いテキストを描画しています。

グラフィック パスを使用してみましたが、(特に小さいテキスト サイズを使用した場合) 悪い結果が得られたので、テキストの周囲の 8 ピクセルの位置に黒のテキストをレンダリングし、その上に白を描画することを考えました。

結果は私が望むものですが、コードはそれほど効率的ではないようです。同じ結果を達成するためのより良い方法はありますか?

私のコード:

Private _whiteFont As New Font("Segoe UI", 8)
Private _blackFont As New Font("Segoe UI", 8)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DrawTextWithOutline("12", New Point(18, 9))
End Sub

Private Sub DrawTextWithOutline(ByVal text As String, ByVal pt As Point)
    Using g As Graphics = Me.CreateGraphics
        g.DrawString(text, _blackFont, Brushes.Black, pt.X - 1, pt.Y) 'left
        g.DrawString(text, _blackFont, Brushes.Black, pt.X, pt.Y + 1) 'top
        g.DrawString(text, _blackFont, Brushes.Black, pt.X + 1, pt.Y) 'right
        g.DrawString(text, _blackFont, Brushes.Black, pt.X, pt.Y + 1) 'bottom
        g.DrawString(text, _blackFont, Brushes.Black, pt.X - 1, pt.Y - 1) 'top left
        g.DrawString(text, _blackFont, Brushes.Black, pt.X - 1, pt.Y + 1) 'bottom left
        g.DrawString(text, _blackFont, Brushes.Black, pt.X + 1, pt.Y - 1) 'top right
        g.DrawString(text, _blackFont, Brushes.Black, pt.X + 1, pt.Y + 1) 'bottom right
        g.DrawString(text, _whiteFont, Brushes.White, pt)
    End Using
End Sub

サンプル結果: ここに画像の説明を入力

4

1 に答える 1

4

GraphicsPath の試行を投稿していませんが、このバージョンは正常に描画されているようです。ボールド フォントを使用して内部の余白を増やし、2 ピクセルの黒ペンを使用してアウトラインを作成しました。

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
Using gp As New GraphicsPath, _
      f As New Font("Segoe UI", 8, FontStyle.Bold), _
      p As New Pen(Brushes.Black, 2)
  gp.AddString(text, f.FontFamily, f.Style, f.Size + 3, New Point(100, 40), _
               StringFormat.GenericTypographic)
  e.Graphics.DrawPath(p, gp)
  e.Graphics.FillPath(Brushes.White, gp)
End Using

美しさは見る人の目にある:

ここに画像の説明を入力

于 2013-10-17T15:56:24.687 に答える