實作功能:直線、矩形、圓形、橡皮擦、顏色切換、開啟/儲存圖片、清除畫布、手動調整畫布大小。啟動時為空白畫布,可直接繪圖或匯入圖片後繪製。
使用兩個 Image 變數:
originalImg:保存已完成繪圖與背景。finishingImg:繪製過程中暫存畫面(含正在拖曳的圖形)。originalImg → 繪製暫時圖形 → 繪至螢幕 → 釋放暫存圖片。originalImg。直接指派 PictureBox.Image = Image.FromFile(path) 會鎖定檔案導致無法覆蓋存檔。解法:
Bitmap src = new Bitmap(openFileDialog.FileName);
Bitmap canvas = new Bitmap(src.Width, src.Height);
using (Graphics g = Graphics.FromImage(canvas)) {
g.Clear(pictureBox.BackColor);
g.DrawImage(src, 0, 0);
}
src.Dispose(); // 立即釋放檔案鎖定
pictureBox.Image = canvas; // 顯示副本
// 同步更新 DrawTools 參考的 originalImg 與 Graphics
在畫布右下角放置 5x5 PictureBox (名為 reSize) 作為拖曳控制點。
bool _resizing = false;
void reSize_MouseDown(...) => _resizing = true;
void reSize_MouseMove(...) {
if (_resizing) reSize.Location = new Point(reSize.Location.X + e.X, reSize.Location.Y + e.Y);
}
void reSize_MouseUp(...) {
_resizing = false;
// 計算新大小(考慮捲軸偏移)
int newW = reSize.Location.X - panel.AutoScrollPosition.X;
int newH = reSize.Location.Y - panel.AutoScrollPosition.Y;
pictureBox.Size = new Size(newW, newH);
// 重建 originalImg 並繪製現有內容
Bitmap newCanvas = new Bitmap(newW, newH);
using (Graphics g = Graphics.FromImage(newCanvas)) {
g.Clear(Color.White);
g.DrawImage(originalImg, 0, 0);
}
originalImg = newCanvas;
// 更新 DrawTools 參考
}
originalImg.Save(path, ImageFormat.Png/Jpeg/Bmp)。Graphics.FillRectangle(Brushes.White, ClientRectangle) 重填白底。完整原始碼可至原文連結下載(VS2005 WinForm 專案)。