DSAPIによる画像処理(その1)

色付きテキストオブジェクト

特定の要件に応じて、色付きテキストオブジェクトを独自に開発しました。この機能はHTML風の構文を使ってテキストを指定し、画像として出力します。

まずはサンプル画像を見てみましょう。

これはテキストではなく、コードによって生成された画像です。実装方法を確認しましょう。

Dim textRenderer As New DSAPI.Image.ColorTextRenderer
With textRenderer
    .CanvasSize = Me.Size
    .DrawOutline = True
    .DrawShadow = True
    .OutlineColor = Color.Black
    .TextQuality = TextRenderingHint.AntiAliasGridFit
    .TextColor = Color.Yellow
    .ShadowSize = 5
    .ShadowIntensity = 30
    .ShadowOffset = New Point(0, 0)
    .LineSpacing = 3
    .CharacterSpacing = 1
    .LinkUnderlineColor = Color.Red
    .Font = New Font("宋体", 9)
    Dim inputText As String = "こんにちは、私は<color=255,0,255>カラ</color><color=0,255,255>フル</color><color=0,255,0>テ</color><color=0,0,255>キ</color>ストです"
    inputText &= vbCrLf & "<color=255,255,255>これは<b>太字</b>、これは<i>斜体</i>、そして<u>下線</u>も可能です"
    inputText &= vbCrLf & "他の<font=微软雅黑>フォント</font>も使用できます"
    inputText &= vbCrLf & "リンクも<color=0,255,0><link=http://www.baidu.com>追加</link></color>可能です"
    .InputCode = inputText
    Me.BackgroundImage = .RenderedImage
End With

ゲーム内の字幕のような効果が得られるのではないでしょうか?実装さえできれば、用途は自由に設定できます。また、リンク機能についてもご注目いただいたと思います。画像として出力されるため、リンクは何の役割があるのでしょうか?もちろん、画像はどこかのコントロールに割り当てられる必要があります。リンクには座標情報が含まれており、コード内でリンクを使用した場合、MouseMoveやMouseDownイベントでマウスの位置をチェックし、リンクかどうか、またどのリンクであるかを判定できます。

すべてのプロパティ設定は、画像を取得する際に適用されます。表示用のテキスト(コードを除去したもの)を取得したい場合は、まず画像を出力してから表示テキストを取得する必要があります。

Me.BackgroundImage = textRenderer.RenderedImage
Console.WriteLine(textRenderer.DisplayText)

出力結果:

こんにちは、私はカラフルテキストです
これは太字、これは斜体、そして下線も可能です
他のフォントも使用できます
リンクも追加可能です

リンク情報の取得

Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    Dim linkInfo As DSAPI.Image.ColorTextRenderer.Link = textRenderer.GetLinkAtPoint(e.Location)
    If linkInfo IsNot Nothing Then
        MsgBox(linkInfo.TargetUrl)
    End If
End Sub

Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    Dim linkInfo As DSAPI.Image.ColorTextRenderer.Link = textRenderer.GetLinkAtPoint(e.Location)
    If linkInfo IsNot Nothing Then
        Me.Cursor = Cursors.Hand
    Else
        Me.Cursor = Cursors.Default
    End If
End Sub

タグ: DSAPI 画像処理 テキストレンダリング VB.NET Windows Forms

7月25日 19:33 投稿