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

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

新規登録して質問してみよう
ただいま回答率
85.48%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

2054閲覧

C#で画像上にTextRenderer.DrawTextで描画したときにアンチエイリアスがかからない

Rei_312

総合スコア24

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2022/09/04 08:56

編集2022/09/04 10:03

.NET 6 のWindows Formsで画像上にテキストを描画する際、Graphics.DrawStringで描画したときはうまくアンチエイリアスがかかるのですが、
TextRenderer.DrawText()を使用するとひどい見た目になります。
OnPaintイベントなどで渡されるGraphicsオブジェクトを使用するときは、正常に描画できるのですが、Graphics.FromImageでもらったオブジェクトを使うと発生します。
(GraphicsのTextRenderingHintはAntiAliasに設定しています)

どうすればきれいに描画できるでしょうか?
テキストの幅を正常に測定したいのでTextRendererを使う必要があります

参考画像:
イメージ説明

描画コード:

C#

1 2void DrawGraphicsDrawString(Graphics g) 3{ 4 g.TextRenderingHint = TextRenderingHint.AntiAlias; 5 g.SmoothingMode = SmoothingMode.AntiAlias; 6 using StringFormat format = StringFormat.GenericTypographic; 7 g.DrawString("Graphics.DrawString", this.Font, brush, 0, 0, format ); 8} 9 10void DrawTextRendererDrawText(Graphics g) 11{ 12 g.TextRenderingHint = TextRenderingHint.AntiAlias; 13 g.SmoothingMode = SmoothingMode.AntiAlias; 14 TextRenderer.DrawText( g, "TextRenderer.DrawText()", this.Font, new Point(0, 0), color, TextFormatFlags.NoPadding ); 15} 16

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/09/04 09:36 編集

コードにスペルミスがあります。コードだけは間違いないようにお願いします。 .NET Core / .NET では特定の OS に依存する機能は Visual Studio のテンプレートで作るプロジェクトには含まれてなく、Windows OS の GDI+ に依存する System.Drawing 名前空間のグラフィックス機能がその一つですが、そこは問題ないのでしょうか。
Rei_312

2022/09/04 10:06

プロジェクトのターゲットフレームワークに.net6-windowsを指定してUseWindowsFormsにTrueを入れている状態(Windows Formsアプリのテンプレートからプロジェクトを作成した状態)なのですが、これは対象のOSをWindowsのみとしてWindows OS依存の機能を使用する、という意味ではないのでしょうか? おなじプロジェクト内でDllImportを使用してWinAPIの呼び出しも行えているので問題はないと思うのですが...
退会済みユーザー

退会済みユーザー

2022/09/04 12:40

> プロジェクトのターゲットフレームワークに.net6-windowsを指定して そういうのは自分の Windows 10 の VS2022 で作成した .NET 6.0 の WinForms アプリのプロジェクトにはないです。 あなたの開発環境は?
Rei_312

2022/09/04 12:42

以下、プロジェクトファイルの内容です <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <ImplicitUsings>enable</ImplicitUsings> <AllowUnsafeBlocks>True</AllowUnsafeBlocks> </PropertyGroup> </Project>
guest

回答1

0

ベストアンサー

ハーフトーンパレットを適用してください。

「Graphics.GetHalftonePalette メソッド」
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.graphics.gethalftonepalette?f1url=%3FappId%3DDev16IDEF1%26l%3DJA-JP%26k%3Dk(System.Drawing.Graphics.GetHalftonePalette)%3Bk(DevLang-csharp)%26rd%3Dtrue&view=dotnet-plat-ext-6.0

C#

1[DllImport("gdi32.dll")] 2private static extern IntPtr SelectPalette(IntPtr hdc, IntPtr hpal, bool bForceBackground); 3 4[DllImport("gdi32.dll")] 5private static extern int RealizePalette(IntPtr hdc); 6 7using (var g = Graphics.FromImage(bitmap)) { 8 IntPtr hdc = g.GetHdc(); 9 IntPtr oldPal = SelectPalette(hdc, Graphics.GetHalftonePalette(), true); 10 RealizePalette(hdc); 11 try { 12 using (var newGraphics = Graphics.FromHdc(hdc)) { 13 // newGraphics に対して文字を書く 14 } 15 } finally { 16 SelectPalette(hdc, oldPal, false); 17 g.ReleaseHdc(); 18 } 19}

投稿2022/09/04 10:24

編集2022/09/04 10:33
KOZ6.0

総合スコア2626

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

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

Rei_312

2022/09/04 11:01

提示して頂いたコードを試してみたところ、文字のアンチエイリアスについては改善されたのですが、透過色でクリアした部分が黒色で塗りつぶされている状態になっています。透過色は使えないのでしょうか?
KOZ6.0

2022/09/04 11:14

後付けで質問されても困るんですが・・・ RealizePalette をやめるとどうなります?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問