C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[41]: 拡縮した画像の上にRectangle [2]


(過去ログ 50 を表示中)

[トピック内 54 記事 (41 - 54 表示)]  << 0 | 1 | 2 >>

■27333 / inTopicNo.41)  Re[37]: 拡縮した画像の上にRectangle
  
□投稿者/ 倉田 有大 (322回)-(2008/11/04(Tue) 03:19:45)
2008/11/04(Tue) 03:23:32 編集(投稿者)
2008/11/04(Tue) 03:22:07 編集(投稿者)

まてよ、猫さんのやろうとしていること結構むずかしいですよ。
私が提言したbitmapオブジェクトを作る方法はだめかもしれません。
元画像が1000x1000ドットでpictureboxの大きさが200x200ぐらいだと、解像度が1/5(4%?)になります。
そんな画像を拡大しても意味がないですよね?
元絵に四角形を描画、ここまではいいです。
あとは、DrawImageの使い方を学習して、通りすがりさんのアドバイスに従って、
ScaleTransform、TranslateTransformの二つの関数の覚える必要があるかもしれません。

現在のところ猫さんはDrawImageの使い方がわかっていないと思います。
やじゅさんに提言してもらったとおり、DobonNetで画像の扱い方を勉強した方が近道です。
僕が猫さんぐらいの力量だとして、実現するのに一週間ぐらいかかるかなあ〜
なにはともあれ、DrawImageを使いこなせるようになるのが先決ですよ。だから、正方形も長方形になったんだし(試してみましたが、あれは元画像も縦長になってましたよ)
引用返信 編集キー/
■27341 / inTopicNo.42)  Re[38]: 拡縮した画像の上にRectangle
□投稿者/ 猫 (43回)-(2008/11/04(Tue) 11:47:50)
No27333 (倉田 有大 さん) に返信

倉田さん、返信ありがとうございます。
早速、倉田さんにご教授いただいたことをふまえ、
なんとか、拡縮した画像の上の任意の点にRectangleを描画することに成功しました。

ですが、倉田さんのソースを参考にすると、
拡大ボタンを押した時、
描画ボタンを押した時に出来た画像が拡大するわけではなく、
また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまします。
きちんと、先に描画した画像を拡大させるにはどうすればよいのでしょうか?
教えていただけませんでしょうか?


引用返信 編集キー/
■27347 / inTopicNo.43)  Re[39]: 拡縮した画像の上にRectangle
□投稿者/ やじゅ (749回)-(2008/11/04(Tue) 12:01:15)
やじゅ さんの Web サイト
2008/11/04(Tue) 12:21:24 編集(投稿者)

No27341 (猫 さん) に返信
> きちんと、先に描画した画像を拡大させるにはどうすればよいのでしょうか?
> 教えていただけませんでしょうか?
>

このやり取りは、ずっと続くのでしょうか(^^;

倉田 有大 さんが「DrawImageを使いこなせるようになるのが先決ですよ」と
仰るように、段階を踏まれてはいかがでしょう。


こんなふうに書くと、また注意されてしまうのかな。
引用返信 編集キー/
■27348 / inTopicNo.44)  Re[40]: 拡縮した画像の上にRectangle
□投稿者/ 猫 (44回)-(2008/11/04(Tue) 12:22:36)
No27347 (やじゅ さん) に返信

やじゅさん、返信ありがとうございます。

希望する拡大のさせ方については、
しばらくの間は教えていただいたことをふまえて自力でやろうとは思っています。

しかし、拡大ボタン(現状、単純にwidthとheightの値を2倍するもの)を押しただけで、
描画ボタンを押した時に出来た画像が拡大するわけではなく、
また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまうんです。

この疑問をとりあえずの最終質問にする意向ですので、
どうか最後にこの質問までご教授願えませんでしょうか?


引用返信 編集キー/
■27355 / inTopicNo.45)  Re[41]: 拡縮した画像の上にRectangle
□投稿者/ Jitta on the way (208回)-(2008/11/04(Tue) 14:29:45)
No27348 (猫 さん) に返信
> ■No27347 (やじゅ さん) に返信
>
> やじゅさん、返信ありがとうございます。
>
> 希望する拡大のさせ方については、
> しばらくの間は教えていただいたことをふまえて自力でやろうとは思っています。
>
> しかし、拡大ボタン(現状、単純にwidthとheightの値を2倍するもの)を押しただけで、
> 描画ボタンを押した時に出来た画像が拡大するわけではなく、
> また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまうんです。

例えば、先に4倍の大きさの画像を用意します。1/4の大きさの PictureBox に、ストレッチして表示します。すると、元の大きさで見せることが出来ます。
PictureBox の大きさを大きくすると、画像を作り直すことなしに、拡大して表示させているように見せられます。

PictureBox には、画像の一部のみを表示するという機能はないので、お望みのことを直接実現することは出来ません。
引用返信 編集キー/
■27360 / inTopicNo.46)  Re[39]: 拡縮した画像の上にRectangle
□投稿者/ 倉田 有大 (323回)-(2008/11/04(Tue) 16:51:03)
> ですが、倉田さんのソースを参考にすると、
> 拡大ボタンを押した時、
> 描画ボタンを押した時に出来た画像が拡大するわけではなく、
> また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまします。
> きちんと、先に描画した画像を拡大させるにはどうすればよいのでしょうか?
> 教えていただけませんでしょうか?

拡大ボタンを押したとき、猫さんがどのように処理しているのかわからないので、何が起こっているのかさっぱりわからないっす。
引用返信 編集キー/
■27371 / inTopicNo.47)  Re[40]: 拡縮した画像の上にRectangle
□投稿者/ 猫 (45回)-(2008/11/04(Tue) 22:27:08)
No27360 (倉田 有大 さん) に返信

Jitta on the wayさん
倉田さん、返信ありがとうございます。

Jitta on the wayさん、
実現できないのですか???

倉田さん、拡大ボタンの処理です。
何がいけないのでしょうか?
private void ExpandImageBotton_Click(object sender, EventArgs e)
{
imgRect.Width *= 2;
imgRect.Height *= 2;
pictureBox1.Invalidate();
}



引用返信 編集キー/
■27372 / inTopicNo.48)  Re[41]: 拡縮した画像の上にRectangle
□投稿者/ やじゅ (751回)-(2008/11/04(Tue) 23:04:27)
やじゅ さんの Web サイト
No27371 (猫 さん) に返信

> しかし、拡大ボタン(現状、単純にwidthとheightの値を2倍するもの)を押しただけで、
> 描画ボタンを押した時に出来た画像が拡大するわけではなく、
> また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまうんです。

imgは、c:\test.jpgのままであり、枠を描画したのがimgに書き込まれている
わけではないのです。



引用返信 編集キー/
■27376 / inTopicNo.49)  Re[41]: 拡縮した画像の上にRectangle
□投稿者/ 倉田 有大 (325回)-(2008/11/05(Wed) 00:37:38)
2008/11/05(Wed) 00:41:03 編集(投稿者)
2008/11/05(Wed) 00:38:14 編集(投稿者)

No27371 (猫 さん) に返信
> ■No27360 (倉田 有大 さん) に返信
>
> Jitta on the wayさん
> 倉田さん、返信ありがとうございます。
>
> Jitta on the wayさん、
> 実現できないのですか???
>
> 倉田さん、拡大ボタンの処理です。
> 何がいけないのでしょうか?
> private void ExpandImageBotton_Click(object sender, EventArgs e)
> {
> imgRect.Width *= 2;
> imgRect.Height *= 2;
> pictureBox1.Invalidate();
> }

DrawImageの使い方ではないでしょうか。
DrawImage(Image, Rectangle);
こっちは、
#指定した位置に指定したサイズで、指定した Image を描画します。
とありますので。

私が試したら一応2倍にはなってますよ(4倍?)ただし、左上を原点としてです。
猫さんは、原点(0,0)ではなく、特定の点を中心にして拡大したいのですよね?

http://msdn.microsoft.com/ja-jp/library/ms142038.aspx

public void DrawImage(
Image image,
Point[] destPoints,
Rectangle srcRect,
GraphicsUnit srcUnit
)

こっちを呼び出してやればいいのではないでしょうか。

>描画ボタンを押した時に出来た画像が拡大するわけではなく、
>また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまうんです。

??これでいいのではないでしょうか?
新たにズーム画像を生成して、画像の上に描画。
おかしいところはないとおもいますが。
引用返信 編集キー/
■27379 / inTopicNo.50)  Re[42]: 拡縮した画像の上にRectangle
□投稿者/ 猫 (46回)-(2008/11/05(Wed) 02:00:50)
2008/11/05(Wed) 02:02:16 編集(投稿者)

No27376 (倉田 有大 さん) に返信

倉田さん返信ありがとうございます。

早速、やってみたのですが、
public void DrawImage(
Image image,
Point[] destPoints,
Rectangle srcRect,
GraphicsUnit srcUnit
)
の使い方がイマイチ分からず全然うまくいきません。

例えば、上記のDrawImage()を使って、
pcturebox(w=500, h=500)上の点(x=100, y=150)に
描いた(w=50, h=30)のRectangleのセンター(x=125, y=165 ですよね?)を
pictureboxのセンター(x=250, y=250)に持って行って、
画像サイズは2倍(画像面積4倍)にするにはどうすればよいでしょうか?

本当にこれが分かれば後は自力でやろうと思いますので、
どうかご教授お願いします。


追伸
>描画ボタンを押した時に出来た画像が拡大するわけではなく、
>また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまうんです。

の件は、画像が下に残ってると縮小したときに煩わしいかなと思いまして;;



引用返信 編集キー/
■27380 / inTopicNo.51)  Re[43]: 拡縮した画像の上にRectangle
□投稿者/ 倉田 有大 (326回)-(2008/11/05(Wed) 02:47:09)
2008/11/05(Wed) 03:02:34 編集(投稿者)
2008/11/05(Wed) 02:50:20 編集(投稿者)

> 早速、やってみたのですが、
> public void DrawImage(
> Image image,
> Point[] destPoints,
> Rectangle srcRect,
> GraphicsUnit srcUnit
> )
> の使い方がイマイチ分からず全然うまくいきません。
>
> 例えば、上記のDrawImage()を使って、
> pcturebox(w=500, h=500)上の点(x=100, y=150)に
> 描いた(w=50, h=30)のRectangleのセンター(x=125, y=165 ですよね?)を
> pictureboxのセンター(x=250, y=250)に持って行って、
> 画像サイズは2倍(画像面積4倍)にするにはどうすればよいでしょうか?
>
> 本当にこれが分かれば後は自力でやろうと思いますので、
> どうかご教授お願いします。

Rectangleのセンターは、画像の座標でしょうか?
pictureBoxの座標でしょうか?
ごっちゃにしてはいけません。
画像の座標と仮定すると。

pictureBoxいっぱいに表示したいんですよね?

Point[] points = new Point[3];
points[0].X = 0;
points[0].Y = 0;
points[1].X = this.pictureBox1.Width;
points[1].Y = 0;
points[1].Y = 0;
points[2].X = 0;
points[2].Y = this.pictureBox1.Height;
e.Graphics.DrawImage(img, points,imgRect,GraphicsUnit.Pixel);

後はrectangleの計算です。

> 描いた(w=50, h=30)のRectangleのセンター(x=125, y=165 ですよね?)を

いや、私に聞かれても。

imgRect.X = 125 - (pictureBox1.Width / 4);
imgRect.Y = 165 - (pictureBox1.Height / 4); ;
imgRect.Width = pictureBox1.Width / 2;
imgRect.Height = pictureBox1.Height / 2;

拡大ボタンを押したら上記のようにimgRectを更新

もし、Rectangleのセンターが画像の座標じゃなかった場合、縮小と逆の計算をして、pictureboxの座標から画像の座標を求めてください。

> 追伸
> >描画ボタンを押した時に出来た画像が拡大するわけではなく、
> >また新たにズーム画像を生成して、その画像が先程の画像の上に描画されてしまうんです。
>
> の件は、画像が下に残ってると縮小したときに煩わしいかなと思いまして;;

pictureBox1.Refresh();
↑よべば一発です。

引用返信 編集キー/
■27406 / inTopicNo.52)  Re[44]: 拡縮した画像の上にRectangle
□投稿者/ 倉田 有大 (327回)-(2008/11/05(Wed) 14:15:20)
追記。
試してないので頭の中で考えてみましたが。
最初に画像を読み込んでpictureboxにリサイズしたときの比率が、たとえば1/2だとすると、これじゃ4倍されてしまいますね(16倍)


> imgRect.X = 125 - (pictureBox1.Width / 4);
> imgRect.Y = 165 - (pictureBox1.Height / 4); ;
> imgRect.Width = pictureBox1.Width / 2;
> imgRect.Height = pictureBox1.Height / 2;

上の式に縮小した比率の計算をいれてやらないといけません。

double int = hiritu;//リサイズしたときの比率

imgRect.X = 125 - (pictureBox1.Width / 2 * hiritu) / 2;
imgRect.Y = 165 - (pictureBox1.Height / 2 * hiritu) / 2;
imgRect.Width = pictureBox1.Width / 2 * hiritu;
imgRect.Height = pictureBox1.Height / 2 * hiritu;

試してないけどこうか?
こんなもん、ためさんと俺にはわからん/(^o^)\
引用返信 編集キー/
■27447 / inTopicNo.53)  Re[41]: 拡縮した画像の上にRectangle
□投稿者/ Jitta (531回)-(2008/11/06(Thu) 00:23:24)
Jitta さんの Web サイト
No27371 (猫 さん) に返信
> ■No27360 (倉田 有大 さん) に返信
>
> Jitta on the wayさん
> 倉田さん、返信ありがとうございます。
>
> Jitta on the wayさん、
> 実現できないのですか???
>
> 倉田さん、拡大ボタンの処理です。
> 何がいけないのでしょうか?
> private void ExpandImageBotton_Click(object sender, EventArgs e)
> {
> imgRect.Width *= 2;
> imgRect.Height *= 2;
> pictureBox1.Invalidate();
> }
>
> 猫
>

情報を小出しにされると、とても困ります。まぁ、私らは逃げれば済むので、困るのは聞いてる本人ですけど。

あなたが思っていることを、他人、全くの他人、会ったこともない他人に、言葉だけで伝えてください。
このとき、ウェブでは言葉の行き来に時間がかかりますから、あなたの友人を捕まえて、「何が聞きたいか、わかる?」と尋ねるのが良いと思います。私がウェブ掲示板を使い始めたときは、コンピュータにはまったく疎い妻を捕まえて、「これで何が聞きたいかわかる?」と、尋ねていました。妻が自分の知っていることに置き換えて私が聞きたいことを説明できるまで、書き直しをしました。それでも、30分もかかってはいませんでした。
引用返信 編集キー/
■27466 / inTopicNo.54)  Re[14]: 拡縮した画像の上にRectangle
□投稿者/ Jitta on the way (212回)-(2008/11/06(Thu) 18:39:45)
No27292 (倉田 有大 さん) に返信
>
>
> using System;
> using System.Collections.Generic;
> using System.ComponentModel;
> using System.Data;
> using System.Drawing;
> using System.Linq;
> using System.Text;
> using System.Windows.Forms;
>
> namespace WindowsFormsApplication2
> {
> public partial class Form1 : Form
> {
> public Form1()
> {
> InitializeComponent();
> }
>
> PictureBox pic;
> Button btn;
> private void Form1_Load(object sender, EventArgs e)
> {
> pic = new PictureBox();
> btn = new Button();
> pic.SizeMode = PictureBoxSizeMode.StretchImage;
pic.SizeMode =
PictureBoxSizeMode.Zoom;

これで、縦横比を維持できる。

ふと思い浮かんだのだけど、「画像を」拡大するのではなく、「表示領域を」拡大すると、今表示している画像を作り直す事なく拡大することが出来る。ただし、画像の一部だけを拡大するのではない。
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 | 2 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -