午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

文字の描画の文字間隔の調整その4_1/2

この記事は前回の
初めて使ってみたStructure、構造体、文字の描画の文字間隔の調整その3の上 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
初めて使ってみたStructure、構造体、文字の描画の文字間隔の調整その3の下 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
続き
前回
イメージ 2
ターンを字間指定0で描画
最終的なかたちとしてはこれでいいけど予定していたかたちとは違っていた
すぐ直せると思っていたけどなかなかできなくて
 
今回
イメージ 1
やっとできた
目的とは外れているけど今回はこれでいい
 
 
イメージ 3
前回の方法で「ショ」を描画
 
イメージ 4
今回の方法でショ
期待通りに描けているショ
前回の方法
イメージ 5
前回の方法では2文字目を描画する位置を求めるときに
1文字目の右端から枠までの長さ9足す
2文字目のその同じ高さの左空白の長さ22の
合計31と
2文字目の左端から枠までの長さ8足す
1文字目のその同じ高さの右空白の長さ30の
合計38
31と38を比較して小さい方の31
31左に移動したところに2文字目を描画する方法だった
 
イメージ 6
結果こうなる
 
求める結果は
イメージ 7
こうだった
 
そのためにとった今回の方法
イメージ 8
右端や左端のピクセルだけではなく
すべての色付きピクセルのあるラインを調べて比較
同じ高さの空白の長さを合計して一番短い長さの分だけ
2文字目を左に移動させる
 
描画の設定は
フォント:Meiryo UI
フォントサイズ:30
Graphics.DrawStringで普通に描画
描画範囲は
Graphics.MeasureStringで取得して小数点は切り上げすると
高さは57ピクセルになる
57個全部のラインを調べる
文字がないラインは-1を入れて、それ以外の色付きピクセルがあれば
そのX座標と枠からの距離を入れる
 
イメージ 9
「シ」の右側の空白の長さ一覧
イメージ 10
「ョ」の左空白の長さ一覧
この二つの一覧を使って、両方共-1以外のラインがあれば合計した一欄を作る
イメージ 11
合計した一覧表
この中から一番小さい数字が目的の数字になる
21
 
 
イメージ 13
この中で一番短いのは
 
イメージ 12
ここの21
 
イメージ 14
「シ」の横幅は48ピクセル
座標だと0から数えるから0から47になるのがややこしいけど
「ョ」の描画位置は48-21=27になる
 
イメージ 15
27に「ョ」を描画したところぴったりくっついた!
 
2文字以上の時も変わらない
イメージ 18
こうあって
 
イメージ 16
こうなって
 
イメージ 17
完成
 
残る問題
イメージ 19
イメージ 20
「ー」の文字が難しいーの横ラインと同じ高さに次の文字がない
「一二」だと最短距離が0(無いって)判定になるから離れたままになってしまう
 
イメージ 21
「十三」の場合、これもなんか違う
 
イメージ 22
「ソノ人」の場合
単純で画数が少なくて似たようなかたちの文字が続くとイマイチな感じなる
 
イメージ 23
「純で」のところ以外はいいなあ
 

    Public Structure QuartetSpace上下左右の空白2
        'Dim DrawRect As Rectangle
        Dim OutSize As Size '外側のサイズ
        Dim InSize As Size '内側のサイズ
        Dim Top As Integer '一番上のピクセルのY座標
        Dim Bottom As Integer
        Dim Left As Integer
        Dim Right As Integer
 
        Dim TopLength As List(Of Integer)
        Dim BottomLength As List(Of Integer)
        Dim RightLength As List(Of Integer) '右側の空白の長さ一覧
        Dim LeftLength As List(Of Integer)
 
        Dim TopPoints As List(Of Integer)
        Dim BottomPoints As List(Of Integer)
        Dim RightPoints As List(Of Integer) '右側のピクセルのX座標一覧
        Dim LeftPoints As List(Of Integer)
    End Structure

f:id:gogowaten:20191018100445p:plain

調べた数値を入れておく構造体
縦書のことを考えてTopとかBottomも作るけど縦書に行く前に描き直すから意味ないなw

ファイル名: 文字の描画位置、範囲_20150409.7z
 
コードしか書いてない2ページ目↓
文字の描画の文字間隔の調整その4_2/2 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
 
また記事を投稿しようと決定ボタンを押してもエラーになって投稿できない
のでまた分割記事になってしまった
 
 
前回と違って2万文字は超えていないのに!
また画像が消えるよ、貼り直しだよ、文字の位置もずれるよ
確認ボタンではしっかり表示されるのに!ヽ(`Д´)ノウワァァァン!!