PictureBoxについて


ケイスケ  2008-12-25 13:57:04  No: 141169  IP: 192.*.*.*

PictureBoxでどの画像が表示されているのか判定したいのですが・・・

編集 削除
ゆ○り乙  2008-12-25 22:44:30  No: 141170  IP: 192.*.*.*

>PictureBoxでどの画像が表示されているのか判定したいのですが・・・
そんな事言われても「勝手にしろ」としか答えようがないさね。
質問するなら、もうちょい明確に何が分からないのか書けや。

編集 削除
s  2008-12-26 11:46:46  No: 141171  IP: 192.*.*.*

>PictureBoxでどの画像が表示されているのか判定したいのですが・・・
では判定方法をひとつお伝えしましょう。
方法自体は簡単なので、一度読めば理解できると思います。


(1)まず、判定したい「PictureBoxに表示されている」画像を見つめます。
    目を閉じても浮かんでくるくらいに見つめるとよいでしょう。

(2)頭の中にある画像ライブラリと、画像が一致するものがあるかチェックしましょう。
  *ここは、記憶力のよい人の方が効率が上がると思います。

(3)見つからない場合は、画像の特徴をキーワードとして検索エンジンでイメージ検索をしてみましょう。

ここまでやって、一致するものがない場合は判定失敗とします。

編集 削除
アクア  URL  2008-12-29 16:17:28  No: 141172  IP: 192.*.*.*

アクアと申します。どうぞ宜しくお願いします。

ケイスケさんと同じ方ではないかもしれませんが、
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=23687&rev=&no=0
の、kei03さんのご質問と関連性が高いので、より詳しい提示がなされている どぼん!さんの掲示板の内容も踏まえて助言申し上げます。
尚、私の開発環境はOS: Windows Vista Ultimate SP1 、開発ツール:Visual Studio 2008 Professional Editionです。

まずこの掲示板のご質問では
> PictureBoxでどの画像が表示されているのか判定したいのですが・・・
とあります。
私ならば複数の画像を管理する方法として、配列やコレクションを使う方法が、まず頭に思い浮かびます。
配列やコレクションであればインデックスでどの画像であるか判定可能である為です。

では、画像を格納する目的で使用する 配列やコレクションで何か良い方法はないだろうか?という事になるのですが、
Visual Basic 2008 の IDEにあるツールボックスに目を通してみると、ImageListコンポーネントを確認できます。
ImageListはImageオブジェクトのコレクションを管理するクラスですので、今回のご質問であればこれを使ってみても良いと思います。

今回の質問の核となる部分のアドバイスは以上ですが、以下にImageListを使ったアプリケーションの簡単なサンプルを提示しますので参考にしてみてください。
まず、新しいWindowsフォームプロジェクトを作成し、
Buttionコントロールを4つ
Labelコントロールを1つ
PictureBoxコントロールを1つ
ImageListコンポーネントを1つ
Timerコンポーネントを1つ
この時、PictureBoxコントロールのSizeプロパティを240,240に設定し、残りのコントロールについては適当に配置を調整して下さい。
コードデザイナの画面で以下のコードを打ち込んでください。

Public Class Form1

    Private imageFileNames() As String
    Private image As System.Drawing.Image   ' 取得したImageオブジェクトを格納する変数
    Private currentIndex As Integer         ' 現在選択されているインデックスを格納する変数
    Private lastIndex As Integer            ' インデックスの最大値を格納する変数

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' 主要コントロールのプロパティを設定する。
        Button1.Text = "読込"
        Button2.Text = "前の画像"
        Button3.Text = "次の画像"
        Button4.Text = "ランダム"
        Label1.Text = "ファイル名: "
        Timer1.Interval = 1000
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim fileDir As String = "C:\Users\Pictures"     ' ←使用している環境に合わせて設定して下さい。
        ' 拡張子がjpgの画像を取得
        imageFileNames = System.IO.Directory.GetFiles(fileDir, "*.jpg")

        ' ImageList1のプロパティを設定
        ImageList1.ColorDepth = ColorDepth.Depth24Bit   ' 画像のイメージ リストの色深度を設定
        ImageList1.ImageSize = New Size(240, 240)       ' コレクションに格納するImageの画像サイズを設定する。
        For i As Integer = 0 To imageFileNames.Count - 1
            image = Bitmap.FromFile(imageFileNames(i))  ' Imageを取得する
            ImageList1.Images.Add(image)                ' 取得したImageオブジェクトをImageListに追加する。
        Next

        currentIndex = 0
        lastIndex = imageFileNames.Count - 1
        PictureBox1.Image = ImageList1.Images(currentIndex)
        ' ファイル名を表示
        Label1.Text = "ファイル名: " & System.IO.Path.GetFileName(imageFileNames(currentIndex))
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If currentIndex = lastIndex Then
            currentIndex = 0
        Else
            currentIndex += 1
        End If
        PictureBox1.Image = ImageList1.Images(currentIndex)
        Label1.Text = "ファイル名: " & System.IO.Path.GetFileName(imageFileNames(currentIndex))
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If currentIndex = 0 Then
            currentIndex = lastIndex
        Else
            currentIndex -= 1
        End If
        PictureBox1.Image = ImageList1.Images(currentIndex)
        Label1.Text = "ファイル名: " & System.IO.Path.GetFileName(imageFileNames(currentIndex))
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        ' タイマーの実行状態の切り替え
        Timer1.Enabled = Not Timer1.Enabled
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        ' ランダム表示
        Dim rnd As Random = New Random()
        Dim randomIndex As Integer = rnd.Next(lastIndex)

        PictureBox1.Image = ImageList1.Images(randomIndex)
        Label1.Text = "ファイル名: " & System.IO.Path.GetFileName(imageFileNames(randomIndex))

        If randomIndex = 0 Then
            MessageBox.Show("インデックスの最小値にに該当する画像")
        ElseIf randomIndex = currentIndex Then
            MessageBox.Show("インデックスの最大値に該当する画像")
        Else
            ' その他はどーでもいいので無視。
        End If
    End Sub
End Class

(上記のプログラムは私で試しに作ってみたコードのコピペですので段組みはほとんど考慮していません。崩れていたら適当に整形してください。)
このサンプルでは指定した画像ファイルをImageオブジェクトとして取得し、そのImageオブジェクトをImageListのコレクションに追加することでインデックス管理を可能にしています。
Button2とButton3のClickイベントで現在のインデックスの値に応じた判定をしています。
どぼん!さんの掲示板に挙がっていた質問はTimer1のTickイベント内で判定と処理を行っていますので、数ある方法の一つとして参考にしてみてください。

編集 削除
おぉっ  2008-12-29 18:15:24  No: 141173  IP: 192.*.*.*

なんて素晴らしいんでしょう!
この質問の仕方に対してここまで親切に教えてあげるなんて。

編集 削除
それはねえ  2008-12-29 20:51:09  No: 141174  IP: 192.*.*.*

> この質問の仕方に対してここまで親切に教えてあげるなんて。

それはねえ、
君みたいな人間がここに荒らしに来るからなんだよ。
アクアさんは一生懸命にVB掲示板を君みたいな人間から守ろうとしているんだよ。
こういう人がいてくれるからVBStationの掲示板のようにならずに済んでいるんだよ。


VBStation - 掲示板
http://www.vbstation.net/qabbs/

編集 削除
ジムニー  2008-12-30 00:45:34  No: 141175  IP: 192.*.*.*

もう少し詳しく書いてくれるとわかりやすい回答が得られると思いますよ。

編集 削除