JapaneseText.vb
''
'' このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Numerics
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Imaging
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing
'' このサンプルでは、GcBitmap 上に日本語テキストを描画する方法を示します。
Public Class JapaneseText
Function GenerateImage(
ByVal pixelSize As Size,
ByVal dpi As Single,
ByVal opaque As Boolean,
Optional ByVal sampleParams As String() = Nothing) As GcBitmap
Dim Text = "日本語(にほんご、にっぽんご)は、主として、日本列島で使用されてきた言語である。日本手話を母語とする者などを除いて、ほぼ全ての日本在住者は日本語を第一言語とする。日本国は法令上、公用語を明記していないが、事実上の公用語となっており、学校教育の「国語」で教えられる。使用者は、日本国内を主として約\uFF11億\uFF13千万人。日本語の文法体系や音韻体系を反映する手話として日本語対応手話がある。"
Dim ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, True, True, True, False, False)
Dim pageWidth = pixelSize.Width
Dim pageHeight = pixelSize.Height
Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, True, dpi, dpi)
Using g = bmp.CreateGraphics(Color.White)
g.Renderer.Multithreaded = True
'' テキストレイアウトを設定します。
Dim tl = g.CreateTextLayout()
tl.FirstLineIndent = 18
tl.ParagraphSpacing = 6
tl.FlowDirection = FlowDirection.VerticalRightToLeft
tl.TextAlignment = TextAlignment.Justified
Dim tf = New TextFormat() With
{
.Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSansJP-Regular.ttf")),
.FontSize = 14
}
'' ページを埋めるためにサンプルテキストを繰り返し追加します。
For i = 0 To 11
tl.Append(Text, tf)
tl.AppendLine()
Next
'' テキストを4つの水平方向に並ぶ列に配置します。
'' @(このサンプルのロジックおよびコードは @{ArabicText} のサンプル画像と同一です。)
Const NCOLS = 4
Dim margin = 36.0F
Dim gap = 18.0F
Dim colHeight = (pageHeight - margin * 2 - gap * (NCOLS - 1)) / NCOLS
tl.MaxWidth = pageWidth
tl.MaxHeight = pageHeight
tl.MarginLeft = margin
tl.MarginRight = margin
tl.MarginTop = margin
tl.MarginBottom = margin + (colHeight + gap) * (NCOLS - 1)
'' テキストが回り込むための任意の矩形領域を指定できます。
'' ここでは、いくつかの画像を描画するために3つの領域を追加します。
tl.ObjectRects = New List(Of ObjectRect)() From
{
New ObjectRect(pageWidth - margin - 267, margin, 267, 200),
New ObjectRect(margin + 100, margin + 60, 133, 100),
New ObjectRect(margin, pageHeight - margin - 301, 200, 301)
}
Using clouds = Util.ImageFromFile(Path.Combine("Resources", "Images", "clouds.jpg"))
g.DrawImage(clouds, tl.ObjectRects(0).ToRectangleF(), Nothing, ia)
End Using
Using firth = Util.ImageFromFile(Path.Combine("Resources", "Images", "firth.jpg"))
g.DrawImage(firth, tl.ObjectRects(1).ToRectangleF(), Nothing, ia)
End Using
Using lavender = Util.ImageFromFile(Path.Combine("Resources", "Images", "lavender.jpg"))
g.DrawImage(lavender, tl.ObjectRects(2).ToRectangleF(), Nothing, ia)
End Using
'' 重要な呼び出し:テキストの描画に必要なグリフを計算し、レイアウトを実行します。
tl.PerformLayout(True)
For col = 0 To NCOLS - 1
Dim nextcol = If(col < NCOLS - 1, col + 1, 0)
'' TextSplitOptions は、残りのテキストをどのように配置するかを TextLayout.Split() に指示します。
'' ここでは、上下の余白を更新することで列から列へと進みます。
Dim tso = New TextSplitOptions(tl) With
{
.RestMarginTop = margin + (colHeight + gap) * nextcol,
.RestMarginBottom = margin + (colHeight + gap) * (NCOLS - 1 - nextcol)
}
Dim rest As TextLayout = Nothing
Dim split = tl.Split(tso, rest)
g.DrawTextLayout(tl, PointF.Empty)
If (split <> SplitResult.Split) Then
Exit For
End If
tl = rest
Next
'' 画像全体の周囲に境界線を描画します。
g.DrawRectangle(New RectangleF(0, 0, bmp.Width, bmp.Height), Color.DarkSlateBlue, 4)
End Using
Return bmp
End Function
End Class