2011-12-31 95 views
2

我試圖實現圖像編輯器,我想在圖片框上的現有圖像上繪製圖像。我已經使用Graphics.DrawImage並使用MouseEventArguments點實現了它。但問題是我想要在繪製圖像頂部繪製一個選擇矩形,當鼠標點擊它時,它應該重繪在新獲得的位置上點擊並拖動鼠標(沒有選擇矩形)。圖像在新位置的渲染緩慢且消耗大量內存,所以我使用GC.collect.Please幫助我實現選擇。我發佈了我已經做到現在以下通過捕獲MouseUp和MouseMove在圖片框中的圖像上繪製圖像(拖動並繪製圖像)

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing.Drawing2D; 

namespace WindowsFormsApplication32 
{ 
    public partial class Form1 : Form 
    { 
     Bitmap timg, timg2; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      timg = new Bitmap(pictureBox1.Image); 
      timg2 = new Bitmap(pictureBox1.Image); 
      pictureBox1.MouseDown+=new MouseEventHandler(pictureBox1_MouseDown); 
     pictureBox1.MouseMove+=new MouseEventHandler(pictureBox1_MouseMove); 

     } 
     private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (e.Button ==MouseButtons.Left) 
      { 
       timg = new Bitmap(timg2); 

       Graphics g = Graphics.FromImage(timg); 
       g.DrawImage(pictureBox2.Image, new Point(e.X, e.Y)); 
       pictureBox1.Image = timg; 
       g.Dispose(); 
       GC.Collect(); 
       //pictureBox1.Invalidate(); 

      } 
     } 
     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       Graphics g = Graphics.FromImage(pictureBox1.Image); 
       g.DrawImage(pictureBox2.Image, new Point(e.X, e.Y)); 
       // pictureBox1.Invalidate(); 
        g.Dispose(); 
        GC.Collect(); 
      } 
     } 

     private void pictureBox1_Click(object sender, EventArgs e) 
     { 

     } 

    } 
} 
+0

設置公共屬性,並在窗體加載圖形g = Graphics.FromImage(timg); – 2011-12-31 20:35:37

回答

4

您應該嘗試將您的繪圖代碼移到OnPaint函數,並從MouseMove調用Invalidate。通過重新創建一個圖形對象,在每個鼠標移動事件上進行繪畫和處理,你將殺死CPU /內存。通過將圖形創建/處置留給Windows窗體,您應該可以獲得更好的結果。 MouseMove事件每秒最多可觸發125次,而OnPaint事件觸發頻率較低。您不希望創建三個圖形上下文(每個圖片框一個,一個用於表單),兩個位圖和一個無效呼叫每秒125次...

例如,解決方案而不是上述只需將本地預先創建的位圖作爲表單中的成員變量,然後在MouseDown上記錄鼠標點並調用invalidate。在窗體的OnPaint中,您可以根據需要使用g.DrawImage()和偏移加上reticule來繪製兩幅圖像。

如果你能夠更徹底地解釋你試圖達到的目標,我可以給出一個代碼示例 - 你能上傳一個演示項目嗎?

最好的問候,

+0

伯內特感謝您的答案。我試圖實現一個應用程序,允許用戶在點擊和拖動時移動圖像。當用戶點擊圖像時,我想要在圖像周圍繪製一個選擇功能區/矩形框。可以爲我提供一個代碼請抽樣。 – techno 2012-01-01 05:01:23