[リストへもどる]
一括表示

投稿時間:2002/10/01(Tue) 14:58
投稿者名:うま
Eメール:
URL :
タイトル:
画像の一部を取り込む方法
こんにちは、質問をさせていただきます。

画像の種類(BMP、JIF、GPG)を問わず表示した画像の一部をドラッグで指定して
その部分を別ファイル名をつけて保存したいのですが・・・。

宜しくお願い致します。<m(__)m>

投稿時間:2002/10/01(Tue) 17:06
投稿者名:これ
URL :
タイトル:
Re: 画像の一部を取り込む方法
> 画像の種類(BMP、JIF、GPG)を問わず表示した画像の一部をドラッグで指定して
> その部分を別ファイル名をつけて保存したいのですが・・・。
こんにちわ。
どこまで説明していいのか分からないので
簡単ですが、おおまかな流れだけ・・・
各コマンドの詳細などはMSDNとかで調べてください

画像は既にPictureBox1に読み込まれているものとします
(PictureBoxはBMP、JPEG、GIFの表示出来るのはご存知ですね?)
PictureBoxのScaleModeはピクセルに、AutoRedrawはTrueにしておきます
読み込み、保存でのファイル名指定はとりあえず
CommonDialogでやっておきましょう

PictureBox1のMouseDownで開始位置のX-Y座標を取ります
PictureBox1のMouseUpで終了位置のX-Y座標を取ります
終了位置と開始位置の差が、指定範囲での幅と高さになります

ラバーバンドを表示したい場合は
Picture1のMouseMoveにも処理が必要でしょう。

別のPictureBox2にPaintPictureメソッドで
PictureBox1の範囲指定した部分を描画します

そしてPictureBox2の内容を保存します
VB純正のSavePictureではBMPしか保存できませんが
他のDLL等を使えば、JPEGやPNGに保存できます
GIFはいろいろややこしいので出来ないと思ってた方がいいかも・・・

後は、CommonDialogの機能やPaintPicture等をAPI化したり
ご自身の分かる範囲で色々機能拡張してください。

投稿時間:2002/10/03(Thu) 19:04
投稿者名:うま
Eメール:
URL :
タイトル:
Re^2: 画像の一部を取り込む方法
こんばんは、これさん。返事が遅れて申し訳ありません。

概略は理解できましたが、具体的にコーディングになると、やはり
わかりません。

☆一つ目の質問です:
> PictureBox1のMouseDownで開始位置のX-Y座標を取ります
> PictureBox1のMouseUpで終了位置のX-Y座標を取ります
> 終了位置と開始位置の差が、指定範囲での幅と高さになります

> 別のPictureBox2にPaintPictureメソッドで
> PictureBox1の範囲指定した部分を描画します
***********************************************************
指定範囲の後、この一部分を取り込むとき
   Picture1.PaintPicture Picture2.????・・・・

の「.????・・・・」の部分がわかりません。


☆二つ目:
> ラバーバンドを表示したい場合は
> Picture1のMouseMoveにも処理が必要でしょう。
*********************************************************
どのようなコーディングを書いたらよいのでしょうか?

☆三つ目:
> そしてPictureBox2の内容を保存します
> VB純正のSavePictureではBMPしか保存できませんが
> 他のDLL等を使えば、JPEGやPNGに保存できます
> GIFはいろいろややこしいので出来ないと思ってた方がいいかも・・・
***********************************************************
このDLLの使い方もまったく理解できておりません。
この点もアドバイスして頂ければと存じます。

結局、初歩の基本的なことしか理解できておりません。
よろしくお願いいたします。<m(__)m>

投稿時間:2002/10/04(Fri) 11:22
投稿者名:これ
URL :
タイトル:
Re^3: 画像の一部を取り込む方法
> ☆一つ目の質問です:
>    Picture1.PaintPicture Picture2.????・・・・
> の「.????・・・・」の部分がわかりません。
> ☆二つ目:
> どのようなコーディングを書いたらよいのでしょうか?
> ☆三つ目:
> このDLLの使い方もまったく理解できておりません。
> この点もアドバイスして頂ければと存じます。
> 結局、初歩の基本的なことしか理解できておりません。

ソースを全部書いてしまうと
うまさんのためにならないと思いますので
今回も概略+ちょっと詳細説明で。
回答の順序が前後しますが・・・

まず、ラバーバンドについて。
ラバーバンドの描画方法は色々あると思うのですが
僕の場合、長方形のShapeコントロールを使った
簡単な方法でやっています。
「ラバーバンド VB」で検索かければ、いくつかサンプルが
引っかかると思いますので、これにこだわらず
ご自分の使いやすい方法を探すのも一つの手かと思います。

Picture1のMouseDownで開始X-Y座標を取りましたが
その値をShapeコントロールのLeft、Topに設定し、表示します。
同時にDrag中のフラグをセットします。

Picture1のMouseMoveで
Drag中フラグがONなら現在のX-Y座標と開始X-Y座標の差を
ShapeコントロールのWidth、Heightプロパティに設定します。
開始座標からマイナス方向に現在位置が変わった場合
ShapeコントロールのLeft、Topプロパティの値を
現在の座標に置換えます。

Picture1のMouseUpでDrag中フラグをOFFにします

次にPaintPicture
MSDNによれば
描画先PictureBox.PaintPicture 元PictureBox.Picture, _
    描画先X座標, 描画先Y座標, 描画先幅, 描画先高さ, _
    元X座標, 元Y座標, 元幅, 元高さ, _
    描画方法
となっています。
描画先はPicture2、元はPicture1ですね。
ここでの元座標や幅、高さはラバーバンドに使っている
ShapeコントロールのLeft、Top、Width、Heightが使えます。
描画方法はそのままコピーするので「vbSrcCopy」を指定します。

最後に保存
基本しか理解されていないとのことでしたので
まずはBMPに保存することに限定されてはいかがでしょう?
SavePicture 描画先PictureBox.Image, 保存先パス
となっています。

その次として、Jpegファイルの保存ですが
僕の場合、明熊工房さんの明熊JPG保存DLLを使っています。
詳細は下記URLでお願いします。
http://www.akikuma.cx/Top.htm
BMP保存が出来ていれば、JPG移行や拡張は簡単だと思います。
がんばってください。

投稿時間:2002/10/04(Fri) 20:49
投稿者名:うま
Eメール:
URL :
タイトル:
Re^4: 画像の一部を取り込む方法
これさん、こんばんは。

お蔭様で、なんとなく全貌が掴めるようになりました。
しかし、下記の問題に出会ったまま糸口が見つかりません。
やり方1で何とか先に進みたいのですが・・・。何が悪いのでしょうか?

Private Sub Command1_Click()
'***** やり方1 *****
' 画像がコントロールにぴったりとは挿入できます。が、この場合、
' 実行時エラー’481’:ピクチャーが不正です。
' となります!

    With Picture1
        .Width = 500
        .Height = .Width * 3 / 4 'デジタルカメラ解像度比:1.33
        .AutoRedraw = True
        .PaintPicture Image1.Picture, _
            0, 0, _
            .ScaleWidth, _
            .ScaleHeight
    End With

'***** やり方2 *****
' 問題無く貼り付けられます。しかし、.Pictureメソッドですと
' 画面が大き過ぎてコントロールからはみ出し、領域指定が
' 上手くいきません。

    With Picture1
        .Width = 500
        .Height = .Width * 3 / 4
'       .AutoRedraw = False
        .Picture = Image1.Picture
    End With

End Sub

Private Sub Picture1_MouseUp(Button As Integer, _
                Shift As Integer, X As Single, Y As Single)

  Picture2.PaintPicture Picture1.Picture, _
        0, 0, Shape1.Width, Shape1.Height, _
        Shape1.Left, Shape1.Top, _
        Shape1.Width, Shape1.Height, vbSrcCopy

End Sub

お手数をお掛けしますが、宜しくアドバイス、お願いいたします。<(_ _)>

投稿時間:2002/10/05(Sat) 11:35
投稿者名:うま
Eメール:
URL :
タイトル:
Re^5: 画像の一部取込(これさーん!)
これさん、こんにちは。

同じ内容(Pictureメソッド)に関する質問です。

PictureBoxのPictureメソッドの画像表示サイズに関することです。
画像の大きさが1280 X 960(640 X 480でも)ですと、どうしても画面から
はみ出してしまいます。これをコントロールサイズ(5cm X 4cm程度)に
画像の全体像を表示させる方法があるのでしょうか?

併せて、アドバイスお願いいたします。<m(__)m>

投稿時間:2002/10/07(Mon) 13:22
投稿者名:これ
URL :
タイトル:
Re^6: 画像の一部取込(これさーん!)
こんにちは。

まず、「ピクチャーが不正です。」は、どのタイミングで出ますか?
PaintPictureで切り取りの時でしょうか?
もしそうなら、
Picture1.Picture = Picture1.Image
とやった後にPaintPictureすれば回避できると思います。

もう一つ、僕の場合
フォームのサイズ変更にPictureBoxが追従します。
さらにPictureBoxの2重化でスクロール出来るようにしています。
なので縮小表示はやってないのですが
PaintPictureで描画先の幅、高さを変えれば、そのサイズで表示されますので
オリジナルサイズのPictureBoxから、縮小サイズのPictureBoxへ
サイズを変えてPaintPictureすれば可能かと思います。
(比率は考えてあげないとダメですけど。)

ただしそれだと、画像の切り取りをする時に、縮小された画像が
対象になってしまうので、ちょっとうまさんの目的とは違うように思います。

マッピング(?)みたいなことを実現されたいのだと
思うのですが、そのあたりのことについては経験がないので
すいませんが、いいアドバイスができません。
力不足で申し訳ないです。