none
如何直接讀取繪圖在PictureBox上面的圖片 RRS feed

  • 問題

  • 我是使用Visual Basic 2008

     

    我因為某種緣故

     

    我必須要抓Bitmap來讀取圖片顏色

     

    但是我卻無法從PictureBox上面找出存入BitMap的用法

     

    繪圖的部分是利用 

     

    Dim g as graphics = mypicbox.creategraphics
    

     

    然後直接利用draw

    進行繪圖

    g.DrawLine(New Pen(Color.Blue), 0, 0, 500, 500)
    

     

    如果讀取Picturebox.image

    也讀不出來

    更糟的是還要判斷 IsNothing 否則容易出錯

     

    煩請高手幫忙解圍 感激不盡

     

     

    • 已編輯 orinx 2010年11月3日 上午 07:45
    2010年11月3日 上午 06:25

解答

  • 上面第二篇網址就在講這件事,引用其中一段:

    GDI 系列的 API 需用 hDC 才能繪圖,但是 g.GetHdc 的圖層並非是直接在圖上 (RowData 層) ,所以 GetPixel(hDC, x, y) 根本沒意義,因此:
    Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
    Dim hDC As IntPtr = g.HetHdc
    得到的是上面黑色的圖層。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 orinx 2010年11月6日 上午 01:25
    2010年11月4日 下午 01:37

所有回覆

  •  

    請教如何加快繪圖的速度

     

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/dd9266a9-ffa1-4662-a5f2-eafd7b3f349c

    Graphics.FromImage 方法

    http://msdn.microsoft.com/zh-tw/library/system.drawing.graphics.fromimage(VS.80).aspx

    直接畫在Bitmap類別吧...

    其實是因為寫Class

    希望User能直接給BitMap

    但Bitmap不知道從何而生

    謝謝你的回應 :)

    2010年11月3日 上午 07:44
  • http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=LockBits%20232

    http://tlcheng.wordpress.com/2009/09/30/net-winform-%e4%b8%ad-picturebox-%e7%9a%84%e5%9c%96%e5%b1%a4/


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月3日 下午 04:15
  • 您可以將這一行:

    Dim g as graphics = mypicbox.creategraphics

    改成:

    Dim bmp As New Bitmap(mypicbox.Width, mypicbox.Height)

    Dim g As graphics =Graphics.FromImage(bmp)

    繪圖完後, 將bmp交給picturebox顯示:

    g.DrawLine(New Pen(Color.Blue), 0, 0, 500, 500)
    mypicbox.Image=bmp

    就不會取不到圖了

    2010年11月4日 上午 02:31
  • 您可以將這一行:

    Dim g as graphics = mypicbox.creategraphics

    改成:

    Dim bmp As New Bitmap(mypicbox.Width, mypicbox.Height)

    Dim g As graphics =Graphics.FromImage(bmp)

    繪圖完後, 將bmp交給picturebox顯示:

    g.DrawLine(New Pen(Color.Blue), 0, 0, 500, 500)
    mypicbox.Image=bmp

    就不會取不到圖了

    我知道可以直接寫成這樣

    但是我寫Class想要方便使用

    下面是寫的Clase

     Public Class SpDraw
        ''' <summary>
        '''取得該點顏色
        '''</summary>
        Public ReadOnly Property GetRGB(ByVal img As Bitmap, ByVal mpoint As Point) As Color
          Get
            If IsNothing(img) = True Then
              Exit Property
            End If
            If mpoint.X < img.Width And mpoint.Y < img.Height Then
              Return img.GetPixel(mpoint.X, mpoint.Y)
            End If
          End Get
        End Property
    End Class
    
    <br/>
    

    寫好了是寫好了 但是因為都抓不到Graphics畫的東西

    因為希望可以寫了之後也能給別人用

    所以希望能找到直接存的方法 

    之後寫在註解中讓使用這段Class的人方便用

     

    2010年11月4日 上午 05:30
  •     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
            Dim g As Graphics = Graphics.FromImage(bmp)
            g.DrawLine(New Pen(Color.Blue), 0, 0, 500, 500)
            PictureBox1.Image = bmp
            Dim c As Color = bmp.GetPixel(0, 0)
            MessageBox.Show(c.ToString)
            Dim sd As SpDraw = New SpDraw()
            c = sd.GetRGB(bmp, New Point(0, 0))
            MessageBox.Show(c.ToString)
        End Sub
    
    不懂您的問題,可以抓到Bitmap的值啊,為何一定要執著於Graphics呢...
    2010年11月4日 上午 06:03
  •     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
            Dim g As Graphics = Graphics.FromImage(bmp)
            g.DrawLine(New Pen(Color.Blue), 0, 0, 500, 500)
            PictureBox1.Image = bmp
            Dim c As Color = bmp.GetPixel(0, 0)
            MessageBox.Show(c.ToString)
            Dim sd As SpDraw = New SpDraw()
            c = sd.GetRGB(bmp, New Point(0, 0))
            MessageBox.Show(c.ToString)
        End Sub
    
    不懂您的問題,可以抓到Bitmap的值啊,為何一定要執著於Graphics呢...

    簡單來說 我要把Pictrue上的圖片轉到bitmap

    是用Graphics繪圖後的產物

    2010年11月4日 上午 07:31
  • 上面第二篇網址就在講這件事,引用其中一段:

    GDI 系列的 API 需用 hDC 才能繪圖,但是 g.GetHdc 的圖層並非是直接在圖上 (RowData 層) ,所以 GetPixel(hDC, x, y) 根本沒意義,因此:
    Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
    Dim hDC As IntPtr = g.HetHdc
    得到的是上面黑色的圖層。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 orinx 2010年11月6日 上午 01:25
    2010年11月4日 下午 01:37
  • 不使用API的話, 還有一個權宜之計, 就是:

    Dim TempBitmap As New Bitmap(PictureBox1.Image)

    處理完TempBitmap再塞回給PictureBox1

    2010年11月5日 上午 02:57