首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# GDI+ 繪圖工具實戰(四)— 繪圖工具類封裝、菜單功能與開檔保存關鍵技術

     編輯:關於C語言

專案架構:主視窗 + DrawTools 工具類

繪圖功能封裝在 DrawTools 類別,主視窗僅調用工具方法,**低耦合、高內聚**。

DrawTools 核心工具

  • 鉛筆、橡皮擦
  • 直線、矩形、圓形
  • 實心矩形、實心圓形

關鍵技術點 1:雙影像緩衝防殘影

  • finishingImg:繪製過程中臨時軌跡(滑鼠移動時的預覽)
  • originalImg:已確認的繪圖內容 + 初始背景
  • 滑鼠移動:Clone originalImg → 畫預覽 → 整體 DrawImage
  • 滑鼠釋放:將預覽合併到 originalImg

關鍵技術點 2:主視窗與工具類通訊

  • 屬性注入:DrawTools_Graphics (畫布)、DrawColor (顏色)、OriginalImg (底圖)
  • 方法調用:對應各工具的繪製方法

關鍵技術點 3:開檔功能 - 解決 GDI+ 一般性錯誤

問題:Image.FromFile 鎖定檔案,無法覆蓋存檔 → 「GDI+ 一般性錯誤」

解法:讀取 → 畫到新 Bitmap → **立即 Dispose 原圖** → 後續操作新 Bitmap


private void openPic_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "JPG|*.jpg|Bmp|*.bmp|所有文件|*.*";
    
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        Bitmap bmpFromFile = new Bitmap(ofd.FileName);  // 鎖定檔案
        
        panel2.AutoScrollPosition = new Point(0, 0);
        pbImg.Size = bmpFromFile.Size;
        reSize.Location = new Point(bmpFromFile.Width, bmpFromFile.Height);
        
        dt.DrawTools_Graphics = pbImg.CreateGraphics();
        
        // 關鍵:畫到新 Bitmap 並釋放原圖
        Bitmap bmp = new Bitmap(pbImg.Width, pbImg.Height);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(pbImg.BackColor), 
            new Rectangle(0, 0, pbImg.Width, pbImg.Height));
        g.DrawImage(bmpFromFile, 0, 0, bmpFromFile.Width, bmpFromFile.Height);
        g.Dispose();
        
        bmpFromFile.Dispose();  // 釋放檔案鎖定!
        
        g = pbImg.CreateGraphics();
        g.DrawImage(bmp, 0, 0);
        g.Dispose();
        
        dt.OriginalImg = bmp;
        bmp.Dispose();
        
        sFileName = ofd.FileName;  // 記錄路徑供存檔覆蓋
        ofd.Dispose();
    }
}

菜單功能實作

  • 開啟圖片 (上述關鍵技術)
  • 存檔 / 另存新檔
  • 清除畫布
  • 手動調整畫布大小

專案下載

完整工程代碼可下載參考(原文提供下載連結)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved