教えてください!!

タグの編集
投稿者 みか  (学生) 投稿日時 2008/10/28 00:21:11
画像上のマウスで示した点の座標とRGBを所得するやり方を教えていただきたいです!!

よろしくお願いします!!
投稿者 緋竜  (小学生) 投稿日時 2008/10/29 05:46:18
難しい質問だと、ココの掲示板の人達は黙秘権を使う感じです(笑)
ARGBとかToArgbとかknownColorとか、まぁ難しそうですよ。
投稿者 葉月  (社会人) 投稿日時 2008/10/29 06:16:49
サンプルコードを書きました。
pictureboxとlabel3つを用意してください。

>>>サンプルコード

Public Class Form1

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Dim bmpSample As Bitmap = PictureBox1.Image

        If bmpSample IsNot Nothing Then
            Label1.Text = bmpSample.GetPixel(e.X, e.Y).ToString
        End If

        Label2.Text = e.X.ToString
        Label3.Text = e.Y.ToString
    End Sub

End Class


>>>補足
 ①pictureBox1のImageには、使用する画像のパスを指定してください。
 ②ラベルは以下の用途に使っています。
  label1 RGB
  label2 X座標
  label3 Y座標
投稿者   (学生) 投稿日時 2008/10/29 07:02:20
もしかして同じ人?
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=13194&page=0
違ったらスマソ
投稿者   (学生) 投稿日時 2008/10/29 08:39:39
ありゃ、リンク先記事消しちゃってやんの。
因みにリンク先は「画面上のカーソル位置の色を取得したい。(他ウィンドウ上のも含め)」
みたいな話題やったとです。
リンク先でリンクされてた↓の続きみたい。
http://www.hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=8249&page=330

でも、こっちの人は「画像上の」って言ってるし別に関係無かったですね。
すいません、忘れてください。
投稿者 緋竜  (小学生) 投稿日時 2008/10/29 08:48:27
質問者とは違いますが。
葉さん、ありがと。
わたしもわからんかったから。
Option Strict On
Public Class form1
    'VisualBasic 2008 
    Private Sub PictureBox1_MouseMove(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Dim bmpSample As Bitmap = CType(PictureBox1.Image, Bitmap)
        If bmpSample IsNot Nothing Then
            Label1.Text = bmpSample.GetPixel(e.X, e.Y).ToString
        End If

        Label2.Text = e.X.ToString
        Label3.Text = e.Y.ToString
    End Sub
End Class

(^_^@)
投稿者 緋竜  (小学生) 投稿日時 2008/10/29 09:34:34
ああ、それとね、{あ}さん、直URLを貼り付けてもIE8はジャンプしません。
まぁ、他の検索バーは知らんが。
投稿者 みか  (学生) 投稿日時 2008/10/29 22:32:16
なんとか思い描いてた感じに近づいてきました。
ありがとうございました!!

ちなみにこういった掲示板を利用されていいただいたのは初めてです。
卒業研究が切羽詰ってまして…

また質問されていただくかもしれません。
皆様ありがとうございました。
投稿者 緋竜  (小学生) 投稿日時 2008/10/30 01:46:28
変数代入

{宣言」
private Syutoku_Color As Color.FromArgb(0)

変更点
label.textのとこ

Syutoku_Color=bmp Sample.getPixel(e.X,e.Y)

VisualBasic2008(無料版)

理解できたら、キャラクタ制作エディターを自作できるかも。
では。
投稿者 さくら  (社会人) 投稿日時 2008/10/30 05:02:21
画面をキャプチャするというのと、組み合わせるとより思い描いたものに近づくと思います。

参考「画面をキャプチャする」
http://dobon.net/vb/dotnet/graphics/screencapture.html
投稿者 みか  (学生) 投稿日時 2008/11/13 00:44:12
分解したRGBの表示まではできたのですが、座標(0,0)から(100,100)までのRGBのデータをエクセルに送るやり方が分かりません。

アドバイスください。
投稿者   (社会人) 投稿日時 2008/11/13 04:52:24
うまくいかれたのですね。
良かったです。

出来れば、現在どのようにやっているかを教えて頂けないでしょうか。
その方が、回答者の方もそれに合わせて回答できると思うので、回答の結果をみかさんのプログラムに取り込みやすくなると思います。

あと、ちょっと質問でわからないところがあるのですが教えてください。

# わからない所1
> 分解したRGBの表示
何をどのように分解してどのように表示してるのでしょうか。

# わからない所2
> 座標(0,0)から(100,100)までのRGBのデータ
これはどのように取得しているのでしょうか?
それともここもわからないのでしょうか。
わからない部分でしたら、(0,0)から(100,100)のデータをどのような形(操作)で取得したいと思っているのでしょうか。

# わからない所3
> エクセルに送る
送るというのはどういうことをお考えですか?
ぱっと思いつくだけで
1.xls形式のファイルに保存したい
2.ファイル形式は何でもいいから、とにかくExcelで開きたい
3.現在起動しているExcelの指定した場所にデータを表示させたい
等が考えられます。

後は、Excelに送るときの形も
1.1セルに100×100のデータを入れたいのか(入れるとしたらどんな風に?)
2.1セルに1ピクセルのデータを入れるのか
3.そもそもExcelのセルの背景色を変えたいのか
等色々考えられます。
投稿者 (削除されました)  () 投稿日時 2008/11/20 06:54:05
(削除されました)
投稿者 葉月  (社会人) 投稿日時 2008/11/20 08:21:52
昨日、気づいたのでいまさらですが……
 他の利用者の参考になるかも知れません。制約つきでサンプルコードを掲載します。
 制約の説明は、以下になります。

>分解したRGBの表示まではできたのですが、座標(0,0)から(100,100)までのRGBのデータをエクセルに送るやり方が分かりません。
 座標0:0~100:100のRGBを取得するのは、処理に負担がかかるため範囲を狭くしています。
 スペックのあるマシーンなら制約なしでも動作しますが、処理が終わるまでビジー状態になるためプログレスバーが必要になります。

>>>サンプルコード
'参照の追加を行う必要があります。詳しくは、注意点を参考にしてください。

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'Excelファイルを保存するフルパスを指定してください。
        Dim strPathXls As String = "フルパスを指定してください"
        Dim bmpSample As Bitmap = PictureBox1.Image
        Dim xlsApp As New Excel.Application        
        Dim xlsBooks As Excel.Workbooks = xlsApp.Workbooks
        Dim xlsBook As Excel.Workbook = xlsBooks.Add
        Dim xlsSheets As Excel.Sheets = xlsBook.Worksheets
        Dim xlsSheet As Excel.Worksheet = xlsSheets.Item(1)
        Dim xlsCells As Excel.Range
        Dim xlsRange As Excel.Range
        xlsCells = xlsSheet.Cells
        '次のセルへ進む
        Const INT_CELL_NEXT = 1
        '列を1行目に戻す
        Const INT_ROW_BACK = 1
        '列
        Dim intRow As Integer = 1
        '行
        Dim intLine As Integer = 1


        For i As Integer = 0 To 10
            For j As Integer = 0 To 10
                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).A.ToString
                LeaseObject(xlsRange1)
                intRow += INT_CELL_NEXT

                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).R.ToString
                LeaseObject(xlsRange1)
                intRow += INT_CELL_NEXT

                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).G.ToString
                LeaseObject(xlsRange1)
                intRow += INT_CELL_NEXT

                xlsRange1 = DirectCast(xlsCells(intLine, intRow), Excel.Range)
                xlsRange1.Value = bmpSample.GetPixel(i, j).B.ToString
                LeaseObject(xlsRange1)
                intRow = INT_ROW_BACK
                intLine += INT_CELL_NEXT
            Next
        Next

        xlsSheet.SaveAs(strPathXls)
        LeaseObject(xlsSheet)
        LeaseObject(xlsSheets)
        xlsBook.Close(False)
        LeaseObject(xlsBook)
        LeaseObject(xlsBooks)
        xlsApp.Quit()
        LeaseObject(xlsApp)
        Me.Close()

    End Sub


    Private Sub LeaseObject(Of T As Class)(ByRef objCom As T, Optional ByVal lease As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If

        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If lease Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)

                    If 0 < count Then
                        Dim strMsg As String = "開放されていないオブジェクトがあります"
                        Dim strTitle As String = "オブジェクトの開放"
                        MessageBox.Show(strMsg, strTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    End If
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub

>>>注意点
①参照の追加を行う必要があります。
 プロジェクト(P)→参照の追加→COMタブ→Microsoft Excel ~(*1) Object Library
  *1 ~入る数字は、利用者の環境により変化します。
②strPathXls変数に、処理するExcelファイルのフルパスを指定する必要があります。
 OSがVistaの場合は、パスの指定場所に注意してください。
③参考程度にしてください。