DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PictureBoxの絵を拡大・縮小

環境/言語:[.NET Framework2.0 XP]
分類:[.NET]

いつもお世話になります。

現在、GraphicsのDrawString()などを使用してPictureBox1に描画しています。
描画は問題なく描画できています。
別に用意したPictureBox2に拡大・縮小コピーをしたいと思っているのですが、
どのように対応していいか分かっておりません。

PictureBox2はPictureBox1と大きさは異なります。
例)PictureBox1(200x100) → PictureBox2(640x480)

Bitmapを拡大率など指定して行う方法などあったのですが、自分で描画した
Graphicsからどのような方法で行うかが分かっておりません。

よろしくお願いします。
いろいろな方法が考えられそうですが、例えば、PictureBox1に直接描画するのではなく、Bitmapオブジェクトに描画し、それをPictureBox1に表示するという方法があります。

どうしてもPictureBox1に表示されている画像をコピーしたいということであれば、

フォーム、コントロールの外観をキャプチャする
http://dobon.net/vb/dotnet/graphics/invokepaint.html

で紹介している方法でできないことはありませんが、あまりいい方法とは思えません。

もしかしたら、PictureBox1に描画するコードをメソッドにしておき、Graphicsとサイズ(あるいは倍率)をパラメータとして与えて描画できるようにした方がよいかもしれません。(倍率はパラメータとしなくても、Graphics.ScaleTransformで倍率を変えればよいかもしれません。)
2009/08/10(Mon) 00:43:29 編集(投稿者)
2009/08/10(Mon) 00:43:19 編集(投稿者)

ありがとうございます。

> いろいろな方法が考えられそうですが、例えば、PictureBox1に直接描画するのではなく、Bitmapオブジェクトに描画し、それをPictureBox1に表示するという方法があります。

一度明日にでも試してみたいと思います。
方法は分かってはないですが、難しそうですね・・・

> どうしてもPictureBox1に表示されている画像をコピーしたいということであれば、
>
> フォーム、コントロールの外観をキャプチャする
> http://dobon.net/vb/dotnet/graphics/invokepaint.html
>
> で紹介している方法でできないことはありませんが、あまりいい方法とは思えません。

最終的に画面に表示できればいいので、Bitmapに描画して拡大・縮小する方向にしたいと思います。

> もしかしたら、PictureBox1に描画するコードをメソッドにしておき、Graphicsとサイズ(あるいは倍率)をパラメータとして与えて描画できるようにした方がよいかもしれません。(倍率はパラメータとしなくても、Graphics.ScaleTransformで倍率を変えればよいかもしれません。)

倍率は描画先のPictureBoxの大きさで決めたいので、Bitmap描画してから、PictureBoxへの倍率を計算できればと思っています。
>>いろいろな方法が考えられそうですが、例えば、PictureBox1に直接描画するのではなく、Bitmapオブジェクトに描画し、それをPictureBox1に表示するという方法があります。
>
> 一度明日にでも試してみたいと思います。
> 方法は分かってはないですが、難しそうですね・・・

PictureBoxのImageプロパティに関するよくある勘違い
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html

の「PictureBoxのGraphicsオブジェクトを一切使用しない方法」で紹介している方法がそれですので、参考にしてみてください。
> PictureBoxのImageプロパティに関するよくある勘違い
> http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
>
> の「PictureBoxのGraphicsオブジェクトを一切使用しない方法」で紹介している方法がそれですので、参考にしてみてください。

ありがとうございます。

何とかBitmapオブジェクトから、PictureBoxへの拡大・縮小描画までできました。
ただ、GraphicsのScaleTransform(x倍率,y倍率)を使用して拡大縮小していますが、どうも、等倍以外思った縦横サイズにならず調査中です・・・
あと少しでしょうか・・
お世話になっております。

UserControlを作成し、その中にPictureBoxを配置してDockをFillにし、
UserControlのサイズに合わせて拡大縮小をしたいと思っています。

あるサイトにあった拡大縮小ロジック(1)を変更し、拡大縮小率を計算して
セットするようにしましたが、UserControlと同じ大きさで拡大・縮小
されず、余白が空いたり、UserControlより大きくなったりしてしまいます。
※478x270が既定値です。描画は正しく行えています。

また、PictureBoxのPictureBoxSizeModeをZoomにして、PictureBox.Imageに
BitMapイメージを直接セット(2)しましたが、やはり、同じ大きさになりませんでした。

これは仕方がないものなのでしょうか・・・。

よろしくお願いします。

(1)拡大・縮小

Image Img = new Bitmap(478, 270);
Graphics g = Graphics.FromImage(Img);
・・・描画処理
PictureBox.Image = ResizeBitmap(Img, PictureBox.Width, PictureBox.Height); // リサイズ処理


// 拡大・縮小
// img 描画したイメージ
// OutWidth 幅
// OutWidth 高さ
private Image ResizeBitmap(Image img, int OutWidth, int OutHeight)
{
Image TargetImg = new Bitmap(OutWidth, OutHeight);

float wRatio = (float)OutWidth / 478;
float hRatio = (float)OutHeight / 270;

Graphics g = Graphics.FromImage(TargetImg);
g.ResetTransform(); // 各変換設定値のリセット
g.ScaleTransform(wRatio, hRatio); // X軸とY軸の拡大率の設定
g.DrawImage(img, 0, 0); // 描画

return TargetImg;
}

(2)
PictureBox.SizeMode = PictureBoxSizeMode.Zoom;
PictureBox.Image = img;
PictureBox.SizeMode = PictureBoxSizeMode.StretchImage
で試してみてはいかがでしょうか?
■No25181に返信(H.K.R.さんの記事)
> PictureBox.SizeMode = PictureBoxSizeMode.StretchImage
> で試してみてはいかがでしょうか?

遅くなり申し訳ありません。

Bitmapを作成し、H.K.Rさんの通りの方法で実現できました。
※うまくいかなかったのは、Bitmapへの描画サイズが間違ってたのが
 原因でした。

ありがとうございました(^-^
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板