画像描画メモ

DPI

DPI:1インチあたりのドット数。値が大きいほど1ピクセルのサイズが小さくなる。また、値が大きいほど実サイズ(インチ)に変換したときに小さくなる。
例)420*350ピクセルのイメージ


  • 解像度が100の場合

  • 幅:420pix / 100 = 4.2インチ

    高さ:350pix / 100 = 3.5インチ

  • 解像度が600の場合

  • 幅:420pix / 600 = 0.7インチ

    高さ:350pix / 600 = 約0.58インチ

異なるDPIの描画先への描画処理

例)小DPI画像を大DPI描画先へ描画する

1ピクセルサイズでは、描画元>描画先 となる。画像描画を行う際、描画元ピクセルが描画先ピクセルサイズになる様に縮小して描画される。(全体では、元画像より小さくなる)逆の場合も同様に考える。ピクセルサイズが拡大して描画される。(全体では、元画像より大きくなる)

//挙動確認用コード
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private PaperSize paper_size = new PaperSize();

    private void button1_Click(object sender, EventArgs e)
    {
        var pdoc = new PrintDocument();
        pdoc.PrintPage += new PrintPageEventHandler(pdoc_PrintPage);
        pdoc.QueryPageSettings += new QueryPageSettingsEventHandler(pdoc_QueryPageSettings);
        var preview_dialog = new PrintPreviewDialog();
        preview_dialog.Document = pdoc;

        //A4サイズでの出力が可能であればそれで出力する。
        foreach (PaperSize ps in pdoc.PrinterSettings.PaperSizes)
        {
            if (ps.Kind == PaperKind.A4)
            {
                paper_size = ps;
                break;
            }
        }

        preview_dialog.ShowDialog();
    }

    void pdoc_QueryPageSettings(object sender, QueryPageSettingsEventArgs e)
    {
        e.PageSettings.PaperSize = paper_size;
    }

    void pdoc_PrintPage(object sender, PrintPageEventArgs e)
    {
        var g = e.Graphics;
        //描画操作の座標系をミリメートルに設定
        //ミリにしておくと直感的なのでよいと思う
        g.PageUnit = GraphicsUnit.Millimeter;

        //ユーザー指定のイメージをロード。オリジナルの幅mm、高さmmを算出しておく。
        var bmp = new Bitmap(textBox1.Text);
        var org_w_mm = bmp.Width / bmp.HorizontalResolution * 25.4;
        var org_h_mm = bmp.Height / bmp.HorizontalResolution * 25.4;
        //Dpiをユーザー指定の値にセット。描画される幅mm、高さmmを算出しておく。
        bmp.SetResolution(Convert.ToSingle(numericUpDown1.Value), Convert.ToSingle(numericUpDown1.Value));
        var draw_w_mm = bmp.Width / bmp.HorizontalResolution * 25.4;
        var draw_h_mm = bmp.Height / bmp.HorizontalResolution * 25.4;

        var draw_pos = new Point(3, 3);
        var font_height = (int)g.MeasureString("サイズ取得", this.Font).Height;

        g.DrawString("ページサイズ:" + paper_size.Kind.ToString(), this.Font, Brushes.Black, draw_pos);
        draw_pos.Y += font_height;
        g.DrawString("オリジナル実幅:" + org_w_mm.ToString() + " mm", this.Font, Brushes.Black, draw_pos);
        draw_pos.Y += font_height;
        g.DrawString("オリジナル実高さ:" + org_h_mm.ToString() + " mm", this.Font, Brushes.Black, draw_pos);
        draw_pos.Y += font_height;
        g.DrawString("描画実幅:" + draw_w_mm.ToString() + " mm"  , this.Font, Brushes.Black, draw_pos);
        draw_pos.Y += font_height;
        g.DrawString("描画実高さ:" + draw_h_mm.ToString() + " mm", this.Font, Brushes.Black, draw_pos);
        draw_pos.Y += font_height * 2;

        g.DrawImage(bmp, draw_pos);
        g.Dispose();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    	  //描画Dpi入力値初期化
        numericUpDown1.Value = 100;
    }
}

文字列の描画処理

文字列描画時の実サイズはポイント単位(1/72インチ ≒ 0.353ミリ)となる。描画処理とは別で調整が必要になるので気をつけること。
10ポイント = 3.53ミリ