質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1452閲覧

文字をビットマップにする時、Graphics.Clear(Transparent)で文字色の輪郭が黒ずむ

byori

総合スコア71

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/08/18 05:25

文字列からビットマップを作成しています。
この時、背景を透明で消していると文字の輪郭が他の色が被ったようになり下記のコードの例だと、
g.Clear(System.Drawing.Color.Transparent/FromArgb(212, 212, 212)./);

文字色は赤ですが輪郭の左右に黒い線があるように見えます。
g.Clear() の色を透明でなく指定すると、奇麗な赤になります。

ここで作った文字画像を他の画像と合わせるので文字以外の背景は透けるようにしたいです。
下記の画像は、左側が背景を透明にした画像でXの輪郭が黒い。右側は、背景を
g.Clear(System.Drawing.Color.FromArgb(212, 212, 212));
にしたので奇麗な赤で表示されています。

背景は透明でゴミ?のようなものが混じらないようにするにはどうしたらいいですか?
教えてください。

Windows10 VS2019 C# WPF

イメージ説明

C#

1 private void TestImage() 2 { 3 Font font = new Font("MSP 明朝", 40); 4 5 using (Bitmap bmp = new Bitmap(200, 200)) 6 { 7 //解像度の設定 8 bmp.SetResolution(96, 96); 9 10 //Graphicsオブジェクトを取得 11 using (Graphics g = Graphics.FromImage(bmp)) 12 { 13 //画像を描画する 14 g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); 15 16 // ブラシを作成する 17 using (System.Drawing.Brush b = new SolidBrush(System.Drawing.Color.Red)) 18 { 19 g.Clear(System.Drawing.Color.Transparent/*FromArgb(212, 212, 212).*/); 20 g.DrawString("XXXXX", font, b, 0, 0); // 10, 22); 21 } 22 } 23 24 var hBmp = bmp.GetHbitmap(); 25 var bm = Imaging.CreateBitmapSourceFromHBitmap( 26 hBmp, 27 IntPtr.Zero, 28 Int32Rect.Empty, 29 BitmapSizeOptions.FromEmptyOptions()); 30 31 var img = new System.Windows.Controls.Image(); 32 img.Width = 200; 33 img.Height = 200; 34 img.Name = "img1"; 35 img.Source = bm; 36 Canvas.SetTop(img, 50); 37 Canvas.SetLeft(img, 50); 38 39 canvas1.Children.Add(img); 40 } 41 }

xaml

1<Canvas Name="canvas1" Background="Transparent" 2 ContextMenu="{StaticResource Menu1}" />

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

おそらくアンチエイリアス関係かと想像します.
(アンチエイリアスをOFFにできるのであれば,試してみてはどうでしょうか)

ググったら似たような話が見つかりました

投稿2021/08/18 06:08

fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2021/08/18 06:26

お世話になります。 まさにその通りでした。ありがとうございます。完璧です! g.Clear(System.Drawing.Color.Transparent/*FromArgb(212, 212, 212).*/); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;   <= ここを追加 g.DrawString("XXXXX", font, b, 0, 0); // 10, 22);
guest

0

解決されているようですが、System.Drawingを参照したくないのでWPFのみバージョンです。

"MSP 明朝"

"MS P明朝"じゃないですかね?

xml

1<Window 2 x:Class="Questions354935.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <Grid> 8 <Canvas Name="canvas1" Background="LightGray" /> 9 <TextBlock 10 FontFamily="MS P明朝" 11 Foreground="Red" 12 Text="XXXXX - TextBlock" FontSize="40pt" /> 13 </Grid> 14</Window>

cs

1using System; 2using System.Globalization; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Interop; 6using System.Windows.Media; 7using System.Windows.Media.Imaging; 8 9namespace Questions354935 10{ 11 public partial class MainWindow : Window 12 { 13 public MainWindow() 14 { 15 InitializeComponent(); 16 TestImage(); 17 TestImage2(); 18 } 19 20 private void TestImage() 21 { 22 //var font = new System.Drawing.Font("MSP 明朝", 40); 23 var font = new System.Drawing.Font("MS P明朝", 40); 24 25 using (var bmp = new System.Drawing.Bitmap(800, 200)) 26 { 27 bmp.SetResolution(96, 96); 28 using (var g = System.Drawing.Graphics.FromImage(bmp)) 29 { 30 g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); 31 using (var b = new System.Drawing.SolidBrush(System.Drawing.Color.Red)) 32 { 33 g.Clear(System.Drawing.Color.Transparent/*FromArgb(212, 212, 212).*/); 34 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 35 g.DrawString("XXXXX - System.Drawing", font, b, 0, 0); // 10, 22); 36 } 37 } 38 39 var hBmp = bmp.GetHbitmap(); 40 var bm = Imaging.CreateBitmapSourceFromHBitmap( 41 hBmp, 42 IntPtr.Zero, 43 Int32Rect.Empty, 44 BitmapSizeOptions.FromEmptyOptions()); 45 46 var img = new Image 47 { 48 Width = 800, 49 Height = 200, 50 Source = bm, 51 }; 52 Canvas.SetTop(img, 100); 53 //Canvas.SetLeft(img, 50); 54 55 canvas1.Children.Add(img); 56 } 57 } 58 59 private void TestImage2() 60 { 61 var text = new FormattedText("XXXXX - DrawingVisual", 62 CultureInfo.CurrentCulture, 63 FlowDirection.LeftToRight, 64 new Typeface("MS P明朝"), 65 40 * (96.0 / 72.0), 66 Brushes.Red, 96); 67 68 var drawingVisual = new DrawingVisual(); 69 var drawingContext = drawingVisual.RenderOpen(); 70 drawingContext.DrawText(text, new Point()); 71 drawingContext.Close(); 72 73 var bmp = new RenderTargetBitmap(800, 200, 96, 96, PixelFormats.Pbgra32); 74 bmp.Render(drawingVisual); 75 76 var img = new Image 77 { 78 Width = 800, 79 Height = 200, 80 Source = bmp, 81 }; 82 Canvas.SetTop(img, 200); 83 //Canvas.SetLeft(img, 50); 84 85 canvas1.Children.Add(img); 86 } 87 } 88}

アプリ画像

微妙に違うのですが、なんでかはわかりません^^;

投稿2021/08/18 11:28

編集2023/07/28 16:35
TN8001

総合スコア9401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/08/18 11:40

WPFは分かりませんが、GDIとGDI+の違いだったりしませんかね?
TN8001

2021/08/18 11:51

そもそも描画基盤が全く違うので、同じにはなりませんよね^^; 文字の太さ?は恐らくそういう関係なんでしょうね(個人的には太いWPFのほうが好みです) 描画位置のズレはどうにかできる気がしますが、(特に調べる気はありませんので)言葉を濁しました^^;
退会済みユーザー

退会済みユーザー

2021/08/19 02:36 編集

同じフォントでも出力結果が違うのが興味深いですね。Grapecityのブログに描画基盤技術の簡単な比較が載っていました。 https://devlog.grapecity.co.jp/windows-forms-wpf-comprison-rendering/ 内部的にDirect3Dを使用しているし、後発なので色々最適化も進んでそうな気がします。System.DrawingでGDI(GDI+)挟まない方がいい気はしますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問