DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33392 / inTopicNo.1)  文字列描写時の縁の太さを大きく指定すると縁が飛び出る現象
  
□投稿者/ 空揚 一般人(1回)-(2016/06/22(Wed) 13:42:20)
  • アイコン環境/言語:[OS : Windows 7 / 言語 : C# / .NET Framework : 4] 
    分類:[.NET] 

    【解決したい問題】

    文字列の縁を描写する際に、縁の太さが大きければ大きいほど、縁がパスから飛び出る現象が起きてしまいます。
    この現象の原因が何なのか、どなたか教えて頂けるでしょうか。"文字列 縁"等で検索しても同様の質問は見つかりませんでした。
    フォントの種類や文字の大きさ、縁の太さなど変更してみましたが、大方飛び出ていました。

    以下、サンプル(C#)です。
    button1のクリックイベントからPistureBox1に文字列を描写するコードになります。

    public void sample()
    {
    string str = "あいうえおかきくけこ\r\n\r\nさしすせそ\r\n\r\nたちつてとなにぬねのはひふへほ";
    int edgeSize = 8;

    Bitmap canvas = new Bitmap( 960, 540 );
    Graphics g = Graphics.FromImage(canvas);
    System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();

    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.PixelOffsetMode = PixelOffsetMode.Half;

    FontFamily ff = new FontFamily("HG丸ゴシックM-PRO"); //"ゴシック"は半角入力です。記事投稿のため、全角になっています。
    gp.AddString(str, ff, 0, 28, new Point(30, 30), StringFormat.GenericDefault);

    Pen edgePen = new Pen( Color.Black, edgeSize );
    g.DrawPath(edgePen, gp);
    g.FillPath( Brushes.White, gp);

    gp.Dispose();
    ff.Dispose();
    g.Dispose();

    pictureBox1.Image = canvas;
    }

    private void button1_Click(object sender, EventArgs e)
    {
    sample();
    }
461×172 => 250×93
イメージ
1466570540.png
/22KB
引用返信 削除キー/
■33393 / inTopicNo.2)  Re[1]: 文字列描写時の縁の太さを大きく指定すると縁が飛び出る現象
□投稿者/ Hongliang 大御所(515回)-(2016/06/22(Wed) 14:52:50)
  • アイコンhttp://stackoverflow.com/questions/25421219/draw-outline-around-string-without-artifacts-in-net
    これですね。
    // 検索キーワードは「GraphicsPath.AddString Spike」でした。spikeを選んだ理由は…何となく。
    PenオブジェクトのLineJoinプロパティで挙動を変更できるようです。
引用返信 削除キー/
■33394 / inTopicNo.3)  Re[2]: 文字列描写時の縁の太さを大きく指定すると縁が飛び出る現象
□投稿者/ 空揚 一般人(2回)-(2016/06/22(Wed) 16:25:55)
  • アイコンNo33393に返信(Hongliangさんの記事)
    > http://stackoverflow.com/questions/25421219/draw-outline-around-string-without-artifacts-in-net
    > これですね。
    > // 検索キーワードは「GraphicsPath.AddString Spike」でした。spikeを選んだ理由は…何となく。
    > PenオブジェクトのLineJoinプロパティで挙動を変更できるようです。


    教えて頂いたアドレスにて確認できました…!
    edgePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
    この一行を追加したら現象も治まり、やっとすっきりできました…ありがとうございました!
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -