アスペクト比を変えずに画面いっぱいに描画する

よく使いたい機能の一つにアスペクト比を変えずに画面いっぱいに描画したい時ってありますよね
tsAccountingのプレビュー画面もこの機能を使ってます

しょっちゅう使うので関数化して戻り値の矩形にそのまま描画すれば良い様にしてあるので、その関数です

 /// <summary>
    /// アスペクト比固定で矩形に収まる描画領域を計算する
    /// </summary>
    /// <param name="round">描画先の矩形</param>
    /// <param name="image">描画イメージのサイズ</param>
    /// <returns>描画する矩形</returns>
    RectangleF fitRect(RectangleF round,SizeF image)
    {
        RectangleF rect = new RectangleF();
        if (image.Width / image.Height < round.Width / round.Height)
        {
            rect.Height = round.Height;
            rect.Width = round.Height * image.Width / image.Height;
            rect.Y = round.Top;
            rect.X = rect.Left + (round.Width - rect.Width) / 2f;
        }
        else {
            rect.Width = round.Width;
            rect.Height = round.Width * image.Height / image.Width;
            rect.X = round.Left;
            rect.Y = round.Top + (round.Height - rect.Height) / 2f;
        }
        return rect;
    }

簡単ですねw
使い方はもっと簡単です
こんな感じ

    RectangleF rect = fitRect(panel1.ClientRectangle, image.Size);
    e.Graphics.DrawImage(image, rect);

こう言う計算を考える時は、とにかく図を描いて考えると良いです

コメント