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

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

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

Re[3]: VB.netでの一部の画像の表示


(過去ログ 114 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■67582 / inTopicNo.1)  VB.netでの一部の画像の表示
  
□投稿者/ 寅 (8回)-(2013/08/10(Sat) 15:40:11)

分類:[.NET 全般] 

C-Builderで作成したプログラムをVB.netに書き換えて居ます。

C-Builderで StretchBit関数で拡大縮小をやっていましたが、VB.netでStretchBitの所を見ても良く分からなかったので、例題サイトで拡大縮小を見つけてやってみました。

私がやりたいのはソース画像の一部の指定画像領域をPictureBoxに縦横比率は変わって構わないのですが、内容を全て表示すると言うものです。

やっと下のプログラムの様にした所、開始点からの画像をPictureBoxに表示する事が出来ましたが、縦横サイズが切り取り指定に指示した画素サイズでコピーされて居る様で、右、及び下の画像がカットされてしまい、かつ、画像自体は拡大されてしまって居る様です。
多分、DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel)の第四パラメーターを替えれば私の思っている動作が出来ると思うのですが、MSDNを読んでも良く分かりません。

何方かお分かりに成る方、宜しくお教え下さい。
若しくはVB.NetでStretchBitのサンプルプログラムの載っているサイトありましたらご紹介下さい。
C-BuilderではポインターでStretchBitの一部を変更して使用して居たのですが、VB.netではポインターの概念が無いらしいと言う事を読み、やり方が分からずに困って居ります。

宜しくお願い致します。


Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
'Imports System.Drawing

Me.pbxCamScr(1).BackgroundImageLayout = ImageLayout.Stretch

' Me.PictureBox1.BackgroundImageLayout = ImageLayout.Stretch
' pbxCamScr(1).BackgroundImage = canvas

'画像の一部を切り取って(トリミングして)表示する

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'画像ファイルのImageオブジェクトを作成する
sWrk = String.Format("{0}", 0)
Mid(sTestFilePath, 5, 1) = sWrk
Dim img As New Bitmap(sCurDir + sTestFilePath) '例題のでは無く、独自のファイルで作成
' Dim img As New Bitmap("C:\test\1.jpg")

'切り取る部分の範囲を決定する。ここでは、(0,0)-(100,100)
Dim srcRect As New Rectangle(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text) '切り取り位置を変更出来る様にして居る
'描画する部分の範囲を決定する。ここでは、(0, 0)の位置に描画する
Dim desRect As New Rectangle(0, 0, srcRect.Width, srcRect.Height)
'画像の一部を描画する
' g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel)
g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel) 'このGraphicsUnit.Pixelを他の物に替えれば良いのか?
'Graphicsオブジェクトのリソースを解放する
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas

End Sub
引用返信 編集キー/
■67583 / inTopicNo.2)  Re[1]: VB.netでの一部の画像の表示
□投稿者/ Hongliang (81回)-(2013/08/10(Sat) 15:51:55)
> '切り取る部分の範囲を決定する。ここでは、(0,0)-(100,100)
> Dim srcRect As New Rectangle(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text) '切り取り位置を変更出来る様にして居る
> '描画する部分の範囲を決定する。ここでは、(0, 0)の位置に描画する
> Dim desRect As New Rectangle(0, 0, srcRect.Width, srcRect.Height)

StretchBltでも、コピー先destのx,y,width,heightとコピー元srcのx,y,witdh,heightを指定しましたよね?
この2つのRectangleも同じです。
元のStretchBltではwidthDestおよびheightDestはどう指定されていましたか?
引用返信 編集キー/
■67585 / inTopicNo.3)  Re[2]: VB.netでの一部の画像の表示
□投稿者/ 寅 (9回)-(2013/08/10(Sat) 18:49:53)
No67583 (Hongliang さん) に返信
> 元のStretchBltではwidthDestおよびheightDestはどう指定されていましたか?
C-Builderではかなりのプログラムを書いているのですが、VB.netはさっぱりで、画像を表示させるだけでも思うように行っていない状態です。
こうすれば表示出来ると言うコメントのみお願いします。
ヒントの様なものを頂いても、今の私にはどうしょうもありません。

引用返信 編集キー/
■67586 / inTopicNo.4)  Re[3]: VB.netでの一部の画像の表示
□投稿者/ Azulean (193回)-(2013/08/10(Sat) 20:20:49)
No67585 (寅 さん) に返信
> ■No67583 (Hongliang さん) に返信
> C-Builderではかなりのプログラムを書いているのですが、VB.netはさっぱりで、画像を表示させるだけでも思うように行っていない状態です。

C++ Builder でこのプログラム書けるだけの力量があるのであれば問題に気づけても良さそうですが、なぜ「VB.NET はさっぱりなので、ヒントではなくソースコードを書いて欲しい」となるのでしょうか。
個人的には不思議に感じます。


> ヒントの様なものを頂いても、今の私にはどうしょうもありません。

まず、Rectangle 構造体のコンストラクタは何を指定するものかを見直してください。
コードを全部もらってくるのは楽ですが、使っている構造体・クラスの意味を調べないと、自分の望むように修正できませんよ。
http://msdn.microsoft.com/ja-jp/library/9wcdy991

// (10,10)-(100,100) の矩形を切り出したいのなら、X = 10, Y = 10, Width = 90, Height = 90 でしょう。第 3 引数、第 4 引数に座標を入れてはいけません。
// 座標を指定して Rectangle を作るメソッドもあるので、Rectangle 構造体のメンバーも調べると言ったことも試すべきです。
引用返信 編集キー/
■67587 / inTopicNo.5)  Re[4]: VB.netでの一部の画像の表示
□投稿者/ 寅 (10回)-(2013/08/10(Sat) 22:36:04)
No67586 (Azulean さん) に返信
> ■No67585 (寅 さん) に返信
>>■No67583 (Hongliang さん) に返信
> C++ Builder でこのプログラム書けるだけの力量があるのであれば問題に気づけても良さそうですが

Azuleanさん、今晩は。
確かにそうお思いに成るのは理解出来ます。
VB.netに変換する必要が出来て、いろいろ試行錯誤やっていますが、C-Builderであれば画像が出て居ればその画像は元に成るバッファーを参照すればそこにあるんですが、VB.Netでは投稿以降色々やっていますが、例えば

PictureBoxのImageに入っていれば動作するサンプルは入手したんですが、縮小表示する為のサンプルはBackGroundImageに入れるものしか無く・・・・

VB.netに慣れている方だと簡単な問題でしょうが、ここら辺の構造が分かって無くてやっているのが実情です。
Cに比べれば高級言語に成りますから、規則が多く、それを知ってからやるべきなんでしょうが、その様な事が出来ないのでウエブサイトを探し回り、情報を探している次第です。
現在は画像の切り出し迄は分かって来ましたが、それを特定の大きさのPictureBoxに表示出来なくて困って居る次第です。
画像の切り出しのサンプルはImageを使って居て、大きさを変えるサンプルはBackGroundImageを使って居ます。
もう少しやってみて、駄目だったら、もう一度StretchBitをトライしてみようと思って居ます。

ヒントでは困りますと書いたのは、知っている人が読めばあの回答で理解出来るのでしょうが、全然分からなく、他の回答者が回答しようとおもっても、これが書かれているから分かるよな、と思われて書き込みが無くなると困るので書き込んだ次第です。

Azuleanさんの様にこの辺を注意して、とか書かれて居るなら未だ色々検討出来ますが。

C++が出来ると書いてしまったので誤解を招いてしまっていますが、VB.netに関しては超初心者です。
VB.netを始めて3週間、夜だけですから、時間数にすれば24時間やっているかどうか。
超初心者が画像等やるなと言われてしまうかもしれませんが・・・・・


引用返信 編集キー/
■67588 / inTopicNo.6)  Re[1]: VB.netでの一部の画像の表示
□投稿者/ Azulean (194回)-(2013/08/10(Sat) 22:54:05)
2013/08/10(Sat) 23:11:56 編集(投稿者)

とりあえず、PictureBox に表示する前に、canvas の Save メソッドを呼んで、切り出した画像が望んだ部分を切り出せているかどうかから確かめてみては?
今のコードにある(1)画像の読み込み、(2)切り出し、(3)画面への表示という3つのプロセスの中から(1)と(2)の部分だけ検証できるようにすることで、(2)までは合っているのか、間違っているのかを切り分けできるでしょう。




-----
何を期待して、何が問題なのか、きちんと伝えられていないと思います。
そういった状況だからこそ、的確なアドバイスも得られず、抽象的な助言や苦言にとどまるのかもしれません。

かくいう私も、問題を的確に把握できておらず、的確な助言・回答をしかねる状況です。
先の回答が当たっていたのか、外れていたのかわかりませんが、もし、私が推測していたように Rectangle の第 3/4 引数の勘違いだったのであれば、TextBox1 〜 TextBox4 が何を意味するのか説明しなければ、たどり着けません…。


> C++が出来ると書いてしまったので誤解を招いてしまっていますが、VB.netに関しては超初心者です。

言語的な壁、フレームワーク的な壁があることは確かですが、問題に遭遇したときの対処方法、たとえば問題を切り分けて検証するといったアプローチはどの言語・フレームワークでも変わらないと思ってはいるのですが、違うもんなのでしょうか?
引用返信 編集キー/
■67589 / inTopicNo.7)  Re[2]: VB.netでの一部の画像の表示
□投稿者/ 寅 (11回)-(2013/08/11(Sun) 00:29:47)
No67588 (Azulean さん) に返信
> 2013/08/10(Sat) 23:11:56 編集(投稿者)
>
TextBox1 〜 TextBox4 が何を意味するのか説明しなければ、

お騒がせして居ます。
説明はこれ以外にも横や前にコメントで書いて置いたつもりですが書き方が悪かったのでしょね。

やっと目的とする事が出来る様に成りました。

目的は画像A、下記のサンプルではPictureBox1に入った画像の一部を切り出して、画像B(PictureBox2)に表示すると言うものです。

切り出しはサイズは先のサンプルではTextBoxで与えていましたが、今回はある程度上手く行ったので別処理でマウスで描画領域を設定して、色々な箇所、縦長、横長でも動作する事を確認してみました。

色々なサンプルを持って来て作成してしまいましたので中には使用されていない行もあるかも知れませんが、とりあえず目的とするプログラムが出来ましたので、これを本プログラムに実装して、無駄等があるかも知れませんが、これからが本当に分からない部分、Direct-Showによるカメラ制御になりますので、その辺が終わった時点でもう一度見直してみます。

お騒がせしました。又分からない事があれば質問させて頂きます。
その時はもう少し質問内容を分かり易く書く様心がけてみます。


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

rtbList.Clear() 'デバック用モニターのクリアー

' テスト画像の取得
PictureBox2.BackgroundImageLayout = ImageLayout.Stretch
Dim SWrk As String = System.IO.Directory.GetCurrentDirectory() + "\test.bmp"
' カンバス作成
Dim canvas As New Bitmap(PictureBox2.Width, PictureBox2.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'画像ファイルのImageオブジェクトを作成する
Dim img As New Bitmap(SWrk)

'切り取る部分の範囲を決定する。ここの値は別のマウス制御で囲まれた範囲を持って来て居る
Dim srcRect As New Rectangle(sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y)

'デバックの為のモニター
SWrk = String.Format("srcRctH:{0} V:{1}", srcRect.Width, srcRect.Height)
rtbList.AppendText(SWrk + vbNewLine)
SWrk = String.Format("Canvas H:{0} V:{1}", canvas.Width, canvas.Height)
rtbList.AppendText(SWrk + vbNewLine)
SWrk = String.Format("Pic2 H:{0} V:{1}", PictureBox2.Width, PictureBox2.Height)
rtbList.AppendText(SWrk + vbNewLine)

'描画する部分の範囲を決定する。ここでは、(0, 0)の位置に描画する
Dim desRect As New Rectangle(0, 0, PictureBox2.Width, PictureBox2.Height)
'画像の一部を描画する
g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel)
'Graphicsオブジェクトのリソースを解放する
g.Dispose()
'PictureBox2に表示する
PictureBox2.BackgroundImage = canvas
End Sub
引用返信 編集キー/
■67590 / inTopicNo.8)  Re[3]: VB.netでの一部の画像の表示
□投稿者/ 寅 (12回)-(2013/08/11(Sun) 00:33:14)
No67589 (寅 さん) に返信
> ■No67588 (Azulean さん) に返信
>>2013/08/10(Sat) 23:11:56 編集(投稿者)
>>
> TextBox1 〜 TextBox4 が何を意味するのか説明しなければ、
>
> お騒がせして居ます。
> 説明はこれ以外にも横や前にコメントで書いて置いたつもりですが書き方が悪かったのでしょね。
>
> やっと目的とする事が出来る様に成りました。
>
> 目的は画像A、下記のサンプルではPictureBox1に入った画像の一部を切り出して、画像B(PictureBox2)に表示すると言うものです。
>
> 切り出しはサイズは先のサンプルではTextBoxで与えていましたが、今回はある程度上手く行ったので別処理でマウスで描画領域を設定して、色々な箇所、縦長、横長でも動作する事を確認してみました。
>
> 色々なサンプルを持って来て作成してしまいましたので中には使用されていない行もあるかも知れませんが、とりあえず目的とするプログラムが出来ましたので、これを本プログラムに実装して、無駄等があるかも知れませんが、これからが本当に分からない部分、Direct-Showによるカメラ制御になりますので、その辺が終わった時点でもう一度見直してみます。
>
> お騒がせしました。又分からない事があれば質問させて頂きます。
> その時はもう少し質問内容を分かり易く書く様心がけてみます。
>
>
> Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
>
> rtbList.Clear() 'デバック用モニターのクリアー
>
> ' テスト画像の取得
> PictureBox2.BackgroundImageLayout = ImageLayout.Stretch
> Dim SWrk As String = System.IO.Directory.GetCurrentDirectory() + "\test.bmp"
> ' カンバス作成
> Dim canvas As New Bitmap(PictureBox2.Width, PictureBox2.Height)
> 'ImageオブジェクトのGraphicsオブジェクトを作成する
> Dim g As Graphics = Graphics.FromImage(canvas)
>
> '画像ファイルのImageオブジェクトを作成する
> Dim img As New Bitmap(SWrk)
>
> '切り取る部分の範囲を決定する。ここの値は別のマウス制御で囲まれた範囲を持って来て居る
> Dim srcRect As New Rectangle(sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y)
>
> 'デバックの為のモニター
> SWrk = String.Format("srcRctH:{0} V:{1}", srcRect.Width, srcRect.Height)
> rtbList.AppendText(SWrk + vbNewLine)
> SWrk = String.Format("Canvas H:{0} V:{1}", canvas.Width, canvas.Height)
> rtbList.AppendText(SWrk + vbNewLine)
> SWrk = String.Format("Pic2 H:{0} V:{1}", PictureBox2.Width, PictureBox2.Height)
> rtbList.AppendText(SWrk + vbNewLine)
>
> '描画する部分の範囲を決定する。ここでは、(0, 0)の位置に描画する
> Dim desRect As New Rectangle(0, 0, PictureBox2.Width, PictureBox2.Height)
> '画像の一部を描画する
> g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel)
> 'Graphicsオブジェクトのリソースを解放する
> g.Dispose()
> 'PictureBox2に表示する
> PictureBox2.BackgroundImage = canvas
> End Sub
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -