none
如何取得Creategraphics 所畫的圖 RRS feed

  • 問題

  • Dim G As Graphics
    G = Me.PictureBox1.CreateGraphics
    .......
    G.DrawLine(myPen, OldX, OldY, e.X, e.Y)
    .......

    用上方的程式在 Me.PictureBox1 上畫圖, 但是不知道如何取得畫的圖, 並存檔,
    需請大大們協助解惑之.

    附註: 我目前不使用下列方法
    Dim bmp as new bitmap(w,h)
    dim G as Graphics = Graphics.FromImage(bmp)
    Me.PictureBox1.Image=bmp
    bmp.save
    2009年9月15日 下午 01:44

解答

所有回覆

  • ...
    會畫到 Me.PictureBox1.Image 內。
    Image 有 Save 方法。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已提議為解答 阿尼 2009年9月15日 下午 03:18
    2009年9月15日 下午 03:11
  • To 心冷大大,

    這是您先前的文章:
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/d9cf71d3-60e6-4032-b537-10e60d42156c/

    Me.PictureBox1.Image.Save("......") 後會出現錯誤訊息, 因為 Image 內是 Nothing,
    如果先載入 Image, Ex: Me.PictureBox1.Image = Image.Fromfile("AA.Jpg")....
    再 Me.PictureBox1.Image.Save("......") 後, 存的檔案也是完全與原始檔案相同, 並沒有將所畫的圖存入......

    拜讀您的文章後, 有個地方不甚瞭解, 可否再請大大指點一二:
    pathS.AddEllipse(10, 110, 200, 200)
    formGraphics.DrawPath(myPen, pathS)

    上面這兩個指令中, 我對 pathS 不瞭解, 不知何種方法才能存檔...

    再次感謝大大的指點.
    2009年9月15日 下午 03:43
  • 剛剛找到一篇文章,
    用 G = Graphics.FromImage(Me.PictureBox1.Image),
    取代 G = Me.PictureBox1.CreateGraphics
     就可以了

    確實是有把畫的圖存進去了, 但是畫的圖卻在螢幕上看不到, 而存檔卻有存, 這是發生了什麼事呢?

    好像 G = Me.PictureBox1.CreateGraphics (螢幕看得到, 存檔存不到) 與 G = Graphics.FromImage(Me.PictureBox1.Image) (螢幕看不到, 存檔存得到) 是相反的????????
    2009年9月15日 下午 04:09
  • 看到了,應該是我忘了。
    我幾乎都不直接在 PictureBox 上畫圖,基於效能考量,我都是先畫在記憶體上...

    看到先前的文章應該是在不同層,也就是說 Image 層跟 DC 層,所以自動重繪時,DC 層會消失。

    你若是用 PictureBox.Image 來畫,若完成 G.Disponse ,應該在自動重繪時會顯示,例如呼叫 Paint 事件。

    如果畫在 DC 層的話,可以考慮螢幕拷貝的方式:
    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=25&Function=202
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月15日 下午 05:19
  • 感謝 心冷大大的指導.

    原來還有所謂的 Image Layer & DC Layer, 這又是未來幾天必須追求的知識.

    使用 Paint 的事件雖然好用, 但 CPU 等級差的, 程式跑起來, 可能有點吃力,
    其實我已經有一些解決的方法了.

    就是畫兩層!

    一層使用 bitmap 畫在記憶體上, 但螢幕看不見
    另一層使用 Creategraphics 的畫在螢幕上,

    Mouse_Move 的事件同時放兩個 Graphics:
    G_bmp.DrawLine(p1, mdX, mdY, nX, nY)      '畫在記憶體
    G_Create.DrawLine(p1, mdX, mdY, nX, nY)   '畫在螢幕

    而 AutoReDraw 的方法就是, 當 Form_DeActive 的事件發生時, 則
    Me.PictureBox1.Image = bmp

    這樣做有兩個好處:
    1. CPU 不會因為 Paint 的事件, 而跑滿百. (幾乎都是個位數而已)
    2. 因為 CPU 不會跑滿百, 會讓 Mouse_Move 的事件可以快速的處理畫圖, 所以不會把畫圓變成多邊形.
    這等於完全解決了我的問題了.

    我會想用 Creategraphics 直接存檔, 是希望 Mouse_Move 只畫一次 Drawline 就好, 不要處理兩個指令來提昇處理速度,
    但好像不能如願, 不過我這個方法已經達到 98 分的需求了.

    謝謝各位大大的撥冗解答, 謝謝.
    2009年9月16日 下午 12:56
  • 遇到跟你一模一樣的問題,請問你現在解決了嗎?
    2014年3月14日 上午 04:49
  • 看看這篇,另外把你的問題完整描述。

    [Net] WinForm 中 PictureBox 的圖層


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2014年3月14日 下午 01:29