none
關於螢幕取點的取點速度 RRS feed

  • 問題

  • 各位大大您好  小弟目前為VB.net的初學者 因工作需要做點小程式
    功能為:在螢幕上滑鼠點到的位置並擷取像素的顏色 並判斷是否為同樣顏色
    不是則轉為其他色 基本上是單純的 白紅色互相切換 在網路大神的領導下
    以及眾多前輩發過文的文章  小弟給他東湊西湊
    一個不小心給他湊出功能出來了 但是好奇的是,
    WHY我在點取畫面 顏色切換時 會給他DELAY個那麼一下下
    還煩請好心的大大能幫忙看一下,謝謝
    =================================================================
    Private Sub PictureBox1_Click_1(ByVal sender As System.Object, ByVal e As _
       System.Windows.Forms.MouseEventArgs) Handles PictureBox1.Click  '點pic時觸發
            TextBox4.Text = e.X                            '取得滑鼠位置xy
            TextBox5.Text = e.Y
            Dim color As Integer                                  '定義它們 開始
            Dim color_r, color_g, color_b As Integer  
            Dim matrix_x1 As Integer = TextBox2.Text
            Dim matrix_y1 As Integer = TextBox3.Text
            Dim g As Graphics = PictureBox1.CreateGraphics
            Dim rec_x1, rec_x2 As Integer
            Dim rec_y1, rec_y2 As Integer
            Dim p As New SolidBrush(c.Red)
            Dim p1 As New SolidBrush(c.White)                 '定義它們 結束
            If (e.X > PictureBox1.Location.X) And (e.X < (TextBox1.Text * TextBox3.Text * 10 + 20)) And _
             (e.Y > PictureBox1.Location.Y) And (e.Y < (TextBox2.Text * TextBox3.Text * 10 + 20)) Then
           '判斷是否在pic所要工作的範圍裡
                rec_x1 = e.X \ (10 * TextBox3.Text)
                rec_y1 = e.Y \ (10 * TextBox3.Text)
                rec_x1 = (rec_x1 * 10 * TextBox3.Text)       'rec_x1 畫矩陣x座標起點
                rec_y1 = (rec_y1 * 10 * TextBox3.Text)       'rec_y1 畫矩陣y座標起點
                rec_x2 = 10 * TextBox3.Text
                rec_y2 = 10 * TextBox3.Text
                color = GetPixel(PictureBox1.CreateGraphics.GetHdc.ToInt32, e.X, e.Y)
                color_r = color Mod 256
                color_g = color \ 256 Mod 256
                color_b = color \ 256 \ 256 Mod 256
                If RGB(color_r, color_g, color_b) = RGB(255, 255, 255) Then           '判斷顏色是否一樣 在這裡做切換
                    g.FillRectangle(p, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                Else
                    g.FillRectangle(p1, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                End If
            End If
        End Sub
    ==============================================================


    PS 上述註解是小弟自己的想法,還請大大們不吝指點12 謝謝   Orz
    2010年2月26日 上午 05:54

解答

  •  先減少 隱含轉換的動作, TextBox.Text屬性的Type是文字, 建議先在前方先轉為應有的數字型別.

      color_b = color \ 256 \ 256 Mod 256 -->直接改成 color \ 65536 mod 256會不會乾脆一點

    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已標示為解答 Lolota Lee 2010年3月2日 上午 02:35
    2010年2月26日 上午 06:08
    版主
  •     Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    
                ' Create a Bitmap object from an image file.
                Dim myBitmap As Bitmap = Me.PictureBox1.Image
    
                ' Get the color of a pixel within myBitmap.
                Dim pixelColor As Color = myBitmap.GetPixel(e.X, e.Y)
                Dim g As Graphics = Graphics.FromImage(myBitmap)
    
                If pixelColor = Drawing.Color.White Then           '判斷顏色是否一樣 在這裡做切換
                    g.FillRectangle(p, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                Else
                    g.FillRectangle(p1, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                End If
    
        End Sub

    程式應該不會動吧,修改部份,參考試試...
    • 已標示為解答 Lolota Lee 2010年3月2日 上午 02:35
    2010年2月26日 上午 07:06

所有回覆

  • 補充一下
    我所謂的DELAY那麼一下下 是指  在畫面上滑鼠不能點太快
    不然顏色會換不過來
    得停頓個一秒之類的 才能在點下去的意思 謝謝
    2010年2月26日 上午 05:56
  •  先減少 隱含轉換的動作, TextBox.Text屬性的Type是文字, 建議先在前方先轉為應有的數字型別.

      color_b = color \ 256 \ 256 Mod 256 -->直接改成 color \ 65536 mod 256會不會乾脆一點

    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已標示為解答 Lolota Lee 2010年3月2日 上午 02:35
    2010年2月26日 上午 06:08
    版主
  •     Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    
                ' Create a Bitmap object from an image file.
                Dim myBitmap As Bitmap = Me.PictureBox1.Image
    
                ' Get the color of a pixel within myBitmap.
                Dim pixelColor As Color = myBitmap.GetPixel(e.X, e.Y)
                Dim g As Graphics = Graphics.FromImage(myBitmap)
    
                If pixelColor = Drawing.Color.White Then           '判斷顏色是否一樣 在這裡做切換
                    g.FillRectangle(p, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                Else
                    g.FillRectangle(p1, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                End If
    
        End Sub

    程式應該不會動吧,修改部份,參考試試...
    • 已標示為解答 Lolota Lee 2010年3月2日 上午 02:35
    2010年2月26日 上午 07:06
  • 感謝大大們的指教^^
    1.關於速度問題 有稍稍修改一下速度已經能即時更換了 感謝bill 大大
    2.關於joe大大所說的方法 小弟試了一下在debug的時候 pixelColor = Drawing.Color.White 兩邊的值都是 ARGB(255,255,255,255)
      但卻很納悶WHY不會跑到THEN下方的執行行,竟然是跑到"ELSE"的判斷式去執行@@ ,是我哪邊有漏掉了嗎,還請大大能不吝解惑 
      程式碼如下:

        Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            x = e.X
            y = e.Y
            Dim mul_1 As Integer = TextBox3.Text
            Dim color As Integer
            Dim color_r, color_g, color_b As Integer
            Dim pixelColor As Color = bmp.GetPixel(x, y)
            Dim matrix_x1 As Integer = TextBox1.Text
            Dim matrix_y1 As Integer = TextBox2.Text
            Dim rec_x1, rec_x2 As Integer
            Dim rec_y1, rec_y2 As Integer
            If (x > PictureBox1.Location.X) And (x < (matrix_x1 * mul_1 * 10 + 20)) And (y > PictureBox1.Location.Y) And (y < (matrix_y1 * mul_1 * 10 + 20)) Then
                If pixelColor = Drawing.Color.White Then
                    g.FillRectangle(p_red, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                Else
                    g.FillRectangle(p_red, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                End If
                PictureBox1.Image = bmp        
             End If

     

    2010年2月27日 下午 09:30
  • 補充一下剛剛的發問:
    debug時 雙方的內容物為
    pixelColor     (name = ffffffff,ARGB(255,255,255,255))
    Drawing.Color.White     (name = WHITE,ARGB(255,255,255,255))
    跟NAME會有關係嗎@@a???
    2010年2月27日 下午 09:33
  • 恩恩 經過測試之後   將
    Drawing.Color.White     修改為--->        Dim temp As Color = Color.FromArgb(255, 255, 255, 255)
    並將程式碼修改成
                If pixelColor = temp Then
                    g.FillRectangle(p_red, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                Else
                    g.FillRectangle(p_whe, rec_x1 + 1, rec_y1 + 1, rec_x2 - 1, rec_y2 - 1)
                End If

    就可以了正常執行了
    請問大大還有其他作法嗎 謝謝

    2010年2月27日 下午 10:37
  • 「會給他DELAY個那麼一下」

    請給估計秒數。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年2月28日 上午 05:38
  • 感謝心冷熱情熄大大的回覆
    用原方法A  及 BILL+JOE 大大的方法B 已經有很~大的改善了
    我想應該是跟變數格式不同有關係....吧
    整個按下去的手感就是不一樣
    方法A 是點一下 得在等個約一秒在按一下才能動作
    方法B 是立即點立即變色
    不好意思 目前程式功力不是很夠  只能用比較大概的說法說明   ^^"
    2010年3月1日 下午 05:32