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

ズームについて

  • 題名: ズームについて
  • 著者: チャム
  • 日時: 2004/08/28 16:26:53
  • ID: 5874
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[C#]
分類:[.NET]

今独学でC#やってるんですが本にもなかなかズームの方法が載ってなくて、困っています。全くズームに関しては触れてないので詳しく教えてくれる人を探しています。誰か教えて下さい(;_;)
■No5874に返信(チャムさんの記事)
> 今独学でC#やってるんですが本にもなかなかズームの方法が載ってなくて、困っています。全くズームに関しては触れてないので詳しく教えてくれる人を探しています。誰か教えて下さい(;_;)

その短い質問内容では、どの手法でやるべきかを薦めることはできませんが、
検索くらいすれば出てくるんでないかい?
http://dobon.net/vb/dotnet/graphics/scaling.html

質問する時は、出来る限り他人にわかるようにして質問してください。
http://dobon.net/vb/bbs/index.html#irresponsible
> 質問する時は、出来る限り他人にわかるようにして質問してください。
> http://dobon.net/vb/bbs/index.html#irresponsible

お返事ありがとうございます★内容がわかりにくくてすいません(>_<)今フォームに画像とリッチテキストとかラベルとかおいてるんです。画像などは拡大縮小ができるんですが拡大、縮小と違ってズームにしたいんです。それって拡大、縮小とほとんど変わらないのでしょうか?
2004/08/31(Tue) 10:32:25 編集(投稿者)

■No5911に返信(チャムさんの記事)
> お返事ありがとうございます★内容がわかりにくくてすいません(>_<)今フォームに画像とリッチテキストとかラベルとかおいてるんです。画像などは拡大縮小ができるんですが拡大、縮小と違ってズームにしたいんです。それって拡大、縮小とほとんど変わらないのでしょうか?

揚げ足取りのような発言はしたくないのですが、
ズームというのは、拡大したり縮小したりすることを指します。
それを踏まえると、

> 画像などは拡大縮小ができるんですが拡大、縮小と違ってズームにしたいんです。

私では、上記文章の意味がわかんないのです。(すいません)

あなたの仰る、「ズーム」は画像全体ではなく、画像のある部分単位の話ですか?
それとも、コントロール自体を拡大したいという意味ですか?
文章から、それらを読み取ることができませんでしたので、再度詳細を説明してください。

厳しいことを言うようですが、掲示板を利用する際は、
サイトに関わらずそのサイトの注意事項を留意してください。
http://dobon.net/vb/bbs/index.html#irresponsible
>>画像などは拡大縮小ができるんですが拡大、縮小と違ってズームにしたいんです。
>
> 私では、上記文章の意味がわかんないのです。(すいません)

毎回説明不足ですいません。画像のある部分単位をズームにしたかったんです。
拡大、縮小とはズームのことだったのは知りませんでした。知識不足ではずかしい限りです。
■No5944に返信(チャムさんの記事)
> 毎回説明不足ですいません。画像のある部分単位をズームにしたかったんです。
> 拡大、縮小とはズームのことだったのは知りませんでした。知識不足ではずかしい限りです。

返事が遅くなりまして申し訳ありません。
急に忙しくなってしまいました。

なるべく、わかりやすく説明するためにマウスポインタの位置の画像を拡大させて、
別コントロールに表示させるような仕様を考えます。
(要するに、虫眼鏡のようなイメージになるのですが...)

元画像をpicutureBox1、拡大画像をpictureBox2として、

Form::Load時でも、初期値でも良いのでまず拡大画像であるpictureBox2を非表示にしておきます。
また、ついでに大きさも合わせておきましょう。

  // this::Load()
  private void Form1_Load(object sender, EventArgs e) {
    pictureBox2.Visible = false;
    pictureBox2.Width = 80;
    pictureBox2.Height = 80;
  }

次に、元画像であるpictureBox1にマウスポインタが出入りすると、
拡大画像を表示するpictureBox2の可視になったり不可視になったりを設定します。

  /* pictureBox::MouseEnter() */
  private void pictureBox1_MouseEnter(object sender, EventArgs e) {
    pictureBox2.Visible = true;
  }

  /* pictureBox::MouseLeave() */
  private void pictureBox1_MouseLeave(object sender, EventArgs e) {
    pictureBox2.Visible = false;
  }

で、元画像であるpictureBox1上でマウスが動いたら位置を合わせて拡大画像を表示させます。

  /* pictureBox1::MouseMove() */
  private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
    int iPointX = PointToClient(MousePosition).X;
    int iPointY = PointToClient(MousePosition).Y;

    pictureBox2.Location = new Point(iPointX - 40, iPointY - 40);
    this.SetZoomupImage();
  }

  /* pictureBox1::MouseMove()から呼ばれるメンバ関数 */
  private void SetZoomupImage() {
    Image img = pictureBox1.Image;
    Graphics g = pictureBox2.CreateGraphics();

    Rectangle rect = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, img.Width * 2, img.Height * 2);
    g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);

    g.Dispose();
    pictureBox1.Refresh();
  }


イベントハンドラは自分で追加してください。
また、このソースは何かと問題(描画のとこ)をはらんでますが、
忙しい身なので... あとは適当に改造するなりしてください。
■No5957に返信(java.lang.Nullpoさんの記事)

 チャムさん、java.lang.Nullpoさん、こんにちは。横槍失礼します。

>     g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);

 えっと、これだと拡大されないんじゃないかと(^_^;)
 このオーバーロードでは指定したサイズで描画することができませんよね?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdrawinggraphicsclassdrawimagetopic.asp

# それとも↓はこのことも含んでたのでしょうか。だとしたら余計なこと言ってすみませんm(__)m
> また、このソースは何かと問題(描画のとこ)をはらんでますが、


 それからこれは個人的興味なのですけど‥‥

>   private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
>     int iPointX = PointToClient(MousePosition).X;
>     int iPointY = PointToClient(MousePosition).Y;

 ここで e.X 、 e.Y の値を使用せずにこのようにしてるのはどういった理由に因るもの
なのでしょうか? 差し支えなければ教えて下さいませ。
2004/09/03(Fri) 14:17:00 編集(投稿者)

■No5972に返信(深山さんの記事)
> えっと、これだと拡大されないんじゃないかと(^_^;)
> このオーバーロードでは指定したサイズで描画することができませんよね?

  Rectangle rect = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, img.Width * 2, img.Height * 2);
  g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);

ペアでやってるので、オートスケールにより拡大はされるようですが?
DrawImage単独で、指定した位置に指定したサイズで描画できるのは知りませんでした。
さしつかえなければ、どうやってやるか教えていただけませんか?
私の方ではどうやってもできないみたいで...

  // 元・画像Image(pictureBox1)
  Image img = pictureBox1.Image;

  // 拡大先・Graphic(pictureBox2でCreate)
  Graphics g = pictureBox2.CreateGraphics();

  // pictureBox2の始点の位置から拡大
  Rectangle rect = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, img.Width * 2, img.Height * 2);

  // 拡大した画像を(x, y)=(0, 0)始点で、rect領域の大きさで描画
  g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);

のつもりだったんですが、DrawImage()メソッドで直接いけますか?

> ここで e.X 、 e.Y の値を使用せずにこのようにしてるのはどういった理由に因るものなのでしょうか?

ごめんなさい、直カキコしていたのですが、引数の存在すっかり忘れておりました。

さきほど、初めて例のコードをコピペして実行してみたのですが、
エラーなく実行され拡大はされるものの、適当すぎてかなり描画がひどいっス。

ご指摘、ありがとうございます & 申し訳ありませんでした。m(_ _)m
■No5973に返信(java.lang.Nullpoさんの記事)

 java.lang.Nullpoさん、こんにちは。深山です。

>>このオーバーロードでは指定したサイズで描画することができませんよね?
> ペアでやってるので、オートスケールにより拡大はされるようですが?

 あれ、拡大されますか(汗)

> さきほど、初めて例のコードをコピペして実行してみたのですが、
> エラーなく実行され拡大はされるものの、適当すぎてかなり描画がひどいっス。

 先程のカキコをする前にこちらでも動かしてみたのですけど、うまくいかなかったもの
ですから‥‥。きっと何かやり方がまずかったのですね。すみませんm(__)m
# でも何がいけなかったんだろう?(ーー;)


 ということなので、以下の内容も当てにならないかも知れませんけど(^_^;)、一応書いて
おきますね。

> DrawImage単独で、指定した位置に指定したサイズで描画できるのは知りませんでした。
> さしつかえなければ、どうやってやるか教えていただけませんか?
> 私の方ではどうやってもできないみたいで...

 単独で、という言い方をすると語弊があるでしょうか。基本的な使用方法に変わりがある
わけではなく、以下のような変更をするだけですので。

>   Rectangle rect = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, img.Width * 2, img.Height * 2);
>   g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);

  Rectangle src = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, 40, 40);
  Rectangle dest = new Rectangle(0, 0, 80, 80);
  g.DrawImage(img, dest, src, GraphicsUnit.Pixel);

# 元のイメージと描画イメージのサイズが異なるのでスケーリングされる‥‥はず。
# こちらでは期待する動作をしたのですけど、どうでしょう?


>>ここで e.X 、 e.Y の値を使用せずにこのようにしてるのはどういった理由に因るものなのでしょうか?
> ごめんなさい、直カキコしていたのですが、引数の存在すっかり忘れておりました。

 あ、了解です(^_^;;;)
■No5976に返信(深山さんの記事)
> あれ、拡大されますか(汗)
ごめんなさい、ウソつきました。
あれじゃ、拡大されません。
実は、元画像がストレッチされており、拡大画像がストレッチされていなかったため、
拡大しているように勘違いしていた模様です。

# お恥ずかしい限りです...

> ということなので、以下の内容も当てにならないかも知れませんけど(^_^;)、一応書いておきますね。
> 単独で、という言い方をすると語弊があるでしょうか。基本的な使用方法に変わりがあるわけではなく、以下のような変更をするだけですので。
>>  Rectangle rect = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, img.Width * 2, img.Height * 2);
>>  g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);
>
>   Rectangle src = new Rectangle(pictureBox2.Location.X, pictureBox2.Location.Y, 40, 40);
>   Rectangle dest = new Rectangle(0, 0, 80, 80);
>   g.DrawImage(img, dest, src, GraphicsUnit.Pixel);
>
> # 元のイメージと描画イメージのサイズが異なるのでスケーリングされる‥‥はず。
> # こちらでは期待する動作をしたのですけど、どうでしょう?

ですね... 勘違いしてました...
「指定したサイズで」でのを使ってるものだとばかり思ってました。
オーバーロードの種類が多くて勘違いしていました。
それに加え上記で説明したように、「ストレッチ」の効果もあり、
「できてるじゃーん...」なんて思ってました。

# かなりお恥ずかしい...

そもそも、リファレンスにも、
  src(==Source(元)の意?), dest(==Destination(目的)の意?)
となってますね。

>>ごめんなさい、直カキコしていたのですが、引数の存在すっかり忘れておりました。
> あ、了解です(^_^;;;)
直カキコだと動作確認もできない上、恥ずかしいミスが多発するので、
私のような若輩者は、控えるようにします。

深山さま、ご指摘ありがとうございました。

# 今見ても、PointToClient()は笑える... (なんてマヌケな...)
  • 題名: Re[10]: ズームについて
  • 著者: チャム
  • 日時: 2004/09/04 22:26:26
  • ID: 5993
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
java.lang.Nullpoさん、深山さんこんにちは。java.lang.Nullpoさんが教えてくれたやり方でズームしてみました。どれぐらい拡大とはいきませんでしたが深山さんのも参考にやってみます。java.lang.Nullpoさん、深山さん親切にありがとうございます(^-^)

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