文字を印刷

タグの編集
投稿者 taka  (社会人) 投稿日時 2020/3/22 15:00:39
文字をプリンタで印字する事について教えてください。

現在 こちらの「第35回 印刷」 の講義を参考にして文字列を印刷できるところまで出来ています。

が、しかし出力結果の精度が荒いのです。試しに似たような文字列(フォント、ポイント)で
  WORD から印刷しますと、思い通りに綺麗な文字で印刷されました。

これはどうすればいいのか、教えてほしいのです。
投稿者 るきお  (社会人) 投稿日時 2020/3/22 21:06:05
第一印象で高DPIの問題かなと思いました。
試しているフォントサイズは10とか12ポイントなどではなく、かなり大きいフォントサイズでしょうか?

フォントサイズ400ポイントでPictureBoxで試してみましたが、確かに同じ400ポイントの「あ」をWordで表示したときに比べてぎざぎざが目立ちます。
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    Dim f As New Font("MS 明朝", 400, FontStyle.Regular)
    e.Graphics.DrawString("あ", f, Brushes.Red, 10, 10)
End Sub


.NET Frameworkの終盤のアップデートではWindowsフォームの高DPI対応が一つのテーマになっており、かなり機能強化されたようですが、WPFなどと比べると万全ではないようです。
高DPI対応のアプリケーション作成については私は詳しくなく、下記の記事を参照してみてください。

Windows フォームでの高 DPI サポート
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/high-dpi-support-in-windows-forms

High DPI Desktop Application Development on Windows
https://docs.microsoft.com/ja-jp/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows

.NET Framework の新機能
https://docs.microsoft.com/ja-jp/dotnet/framework/whats-new/

高DPIの問題ではない可能性もあります。たとえば、使用されているフォントに収録されていないサイズを使って印刷しようとしているかもしれません。この場合ソフトウェアの機能で、フォントを拡大縮小して印刷することになると思いますが、Wordに搭載されている拡大縮小ロジックが優れていて、対応していないサイズを滑らかに見せているのかもしれません。

同じことはサイズではなく、太字や斜体にも言えます。太字や斜体が収録されていないフォントで太字や斜体で印字しようとするとソフトウェアによる変換が行われます。
(※ただ、この変換はWindowsでやっているかもしれません。Wordはワープロであり、文字のきれいさは売りの1つだと思うので独自の処理をやっている可能性はあるのではなかと推測します。)

フォントに収録されているサイズや書体はWindowsフォルダーのFontフォルダーでFontファイルをダブルクリックするとわかります。

MS 明朝 標準を見ていると私の環境では収録されている最大サイズは 72 です。
ダブルクリックするとフォントビューワーでサンプル文字が表示されますが、このサンプルよりWordの方が滑らかで、VBはフォントビューワーと同じぎざぎざ具合でした。

なかなか難しい問題かもしれません。

投稿者 (削除されました)  () 投稿日時 2020/3/23 19:52:34
(削除されました)
投稿者 (削除されました)  () 投稿日時 2020/3/23 20:06:34
(削除されました)
投稿者 taka  (社会人) 投稿日時 2020/3/23 20:10:07
るきお 様
返信ありがとうございます。

フォントサイズですが10から18ポイント位を使っています。

前に役に立つかもと思って何かでちら見したのを下記をメモで残したのですが、何のことかさっぱり解りません。もしかしたら関係あるかな?
ラベルコントロールーーメソッド
「Logical To DeviceUnits(INT32)」 論理DPI値をその同等Device Unitに変換します。
「Logical To DeviceUnits(SIZE)」現在のDPIに合わせて拡縮し、幅、高さを最近整数に丸める事で、論理単位からデバイス単位にサイズ変換します。


特段急ぎでもないため
教えてくださったサイトから他も色々調べながらじっくり見ていこうと思います。
投稿者 (削除されました)  () 投稿日時 2020/3/27 20:50:30
(削除されました)
投稿者 taka  (社会人) 投稿日時 2020/3/27 21:33:49
経過報告になります。

あれからMSDNフォーラムにも質問をしたところ TextRenderingHint なるものを教えてもらい
試しに下記のように設定したところ大幅に改善できました。

https://social.msdn.microsoft.com/Forums/Windowsdesktop/ja-JP/759b2a89-ad4b-4fa9-9673-b2fac8dfb34a/-?forum=netfxgeneralja

Imports System.Drwaing.Text
.
.
Dim g As Graphics = Graphics.FromImage(sd2img)
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit


この度はありがとうございました。
投稿者 るきお  (社会人) 投稿日時 2020/3/28 08:26:07
フィードバックありがとうございます。
私も勉強になりました。