亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

深入c# GDI+簡單繪圖的具體操作步驟(四)

2020-01-24 03:17:00
字體:
來源:轉載
供稿:網友
前幾篇我已經向大家介紹了如何使用GDI+來繪圖,并做了一個截圖的實例,這篇我向大家介紹下如何來做一個類似windows畫圖的工具.
個人認為如果想做一個功能強大的繪圖工具,那么單純掌握GDI還遠遠不夠,我的目前也只能做一個比較簡單的繪圖工具了.不足之處,歡迎大家討論!
先來看一下最終效果吧:

主要實現功能:畫直線,矩形,橡皮,圓形,切換顏色,打開圖片,保存圖片,清除圖片,手動調節畫布大小;軟件剛啟動時,為一張空白畫布,我們可以直接在畫布上繪畫,也可以通過菜單中的“打開”,導入一張圖片,然后我們就可以在這張圖片上進行繪制。
平臺:VS2005 WINFORM
由于代碼過多,在這里只簡要介紹下制作步驟,提供大家工程下載.
1.對整個界面進行布局.
2.實現繪圖工具的功能
3.實現顏色拾取的功能,這里我們直接拿上次寫的自定義控件來用.
4.實現菜單功能
5.實現手動調節畫布大小的功能
6.測試
實現繪圖工具的功能
為了讓代碼藕合度小點,稍許用了些設計模式,因為不是很會,所以代碼還是有點亂亂的,嘿嘿!關于繪圖工具的這些功能塊全部寫在了DrawTools這個類里.那么在主窗體中,只需要調用這個類來完成繪制就行了,而不需要過多的涉及到具體的繪圖代碼。繪圖工具這個類提供的主要工具就是:鉛筆、橡皮、直線、矩形、圓形、實心矩形、實心圓形。關于這些功能塊的代碼,并不難,只要大家對認真看過前幾篇內容,那應該都看得懂。
這里要注意以下幾點:
1.如何防止記錄不必要的繪圖過程中的痕跡?
這個問題在第三篇中有提到過,大家不妨先去看看那一篇。為了讓代碼看起來可讀性高點,我設置了兩個Image變量,finishingImg用來保存繪圖過程中的痕跡,orginalImg用來保存已完成的繪圖過程和初始時的背景圖片。
2.這個類如何與主窗體進行通信?
當然如果直接將這些功能塊寫在主窗體中自然沒有這個問題。但是那樣代碼會顯得很混雜,如果只是工具代碼出現問題就需要改整個項目。我在這里通過定義方法和屬性,讓主窗體通過給屬性賦值將畫板畫布以及顏色什么的信息傳給這個工具類,然后通過調用相應的工具方法來使用這些工具。
3.關鍵屬性
要想讓這些工具能正常使用,必須傳遞給他以下幾樣東西:目標畫板(也就是picturebox),繪圖顏色,原始畫布。
實現菜單功能
  
這里就需要我們對文件的操作有一點了解,大家可以去查一下相關資料。
難點主要就是“打開”這個菜單項的實現
我們要實現將打開后的圖片在修改后重新保存就必須讓文件在打開后就能關閉,否則就會因為文件打開而無法覆蓋原文件。就會導致編譯時彈出“GDI  一般性錯誤”。所以根據網上其它朋友的做法就是先將打開的圖片通過GDI+將圖片畫到另一個畫布上,然后及時關閉打開的圖片和用來繪制該圖片的畫板。
復制代碼 代碼如下:

private void openPic_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();//實例化文件打開對話框
            ofd.Filter = "JPG|*.jpg|Bmp|*.bmp|所有文件|*.*";//設置對話框打開文件的括展名
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Bitmap bmpformfile = new Bitmap(ofd.FileName);//獲取打開的文件
                panel2.AutoScrollPosition = new Point(0,0);//將滾動條復位
                pbImg.Size = bmpformfile.Size;//調整繪圖區大小為圖片大小
                reSize.Location = new Point(bmpformfile.Width, bmpformfile.Height);//reSize為我用來實現手動調節畫布大小用的
                //因為我們初始時的空白畫布大小有限,"打開"操作可能引起畫板大小改變,所以要將畫板重新傳入工具類
                dt.DrawTools_Graphics = pbImg.CreateGraphics();
                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));//不使用這句話,那么這個bmp的背景就是透明的
                g.DrawImage(bmpformfile, 0, 0,bmpformfile.Width,bmpformfile.Height);//將圖片畫到畫板上
                g.Dispose();//釋放畫板所占資源
                //不直接使用pbImg.Image = Image.FormFile(ofd.FileName)是因為這樣會讓圖片一直處于打開狀態,也就無法保存修改后的圖片
                bmpformfile.Dispose();//釋放圖片所占資源
                g = pbImg.CreateGraphics();
                g.DrawImage(bmp, 0, 0);
                g.Dispose();
                dt.OrginalImg = bmp;
                bmp.Dispose();
                sFileName = ofd.FileName;//儲存打開的圖片文件的詳細路徑,用來稍后能覆蓋這個文件
                ofd.Dispose();
            }
        }

清除圖像其實就是用白色填充整個畫布
其它的都比較簡單,這就不具體講了。
實現手動調節畫布大小
網上有人說使用API,但是個人覺得還是使用其它控件幫忙比較簡單,至少我們還看得懂。
思路:放置一個picturebox1(尺寸為5*5),將它固定在主畫板的右下角,然后改變鼠標進入時的Cursor為箭頭形狀,設置鼠標按下移動時的事件,讓該picturebox1 跟隨鼠標移動。當鼠標松開時,將主畫板的右下角坐標調整為picturebox1的坐標。
下面來看下代碼:
其中的reSize就是我們用來幫忙的picturebox控件 
復制代碼 代碼如下:

private bool bReSize = false;//是否改變畫布大小
        private void reSize_MouseDown(object sender, MouseEventArgs e)
        {
            bReSize = true;//當鼠標按下時,說明要開始調節大小
        }
        private void reSize_MouseMove(object sender, MouseEventArgs e)
        {
            if (bReSize)
            {
                reSize.Location = new Point(reSize.Location.X + e.X, reSize.Location.Y + e.Y);
            }
        }
        private void reSize_MouseUp(object sender, MouseEventArgs e)
        {
            bReSize = false;//大小改變結束
            //調節大小可能造成畫板大小超過屏幕區域,所以事先要設置autoScroll為true.
            //但是滾動條的出現反而增加了我們的難度,因為滾動條上下移動并不會自動幫我們調整圖片的坐標。
            //這是因為GDI繪圖的坐標系不只一個,好像有三個,沒有仔細了解,一個是屏幕坐標,一個是客戶區坐標,還個是文檔坐標。
            //滾動條的上下移動改變的是文檔的坐標,但是客戶區坐標不變,而location屬性就屬于客戶區坐標,所以我們直接計算會出現錯誤
            //這時我們就需要知道文檔坐標與客戶區坐標的偏移量,這就是AutoScrollPostion可以提供的
            pbImg.Size = new Size(reSize.Location.X - (this.panel2.AutoScrollPosition.X), reSize.Location.Y - (this.panel2.AutoScrollPosition.Y));
            dt.DrawTools_Graphics = pbImg.CreateGraphics();//因為畫板的大小被改變所以必須重新賦值
            //另外畫布也被改變所以也要重新賦值
            Bitmap bmp = new Bitmap(pbImg.Width, pbImg.Height);
            Graphics g = Graphics.FromImage(bmp);
            g.FillRectangle(new SolidBrush(Color.White), 0, 0, pbImg.Width, pbImg.Height);
            g.DrawImage(dt.OrginalImg, 0, 0);
            g.Dispose();
            g = pbImg.CreateGraphics();
            g.DrawImage(bmp, 0, 0);
            g.Dispose();
            dt.OrginalImg = bmp;
            bmp.Dispose();
        }

效果如下圖(仔細看白色區域的右下角):
  
此時就可以通過拖動那個小方塊來調節圖片大小了。
這樣,主要的問題差不多已經解決了,但還是有不足這處,歡迎大家提出寶貴的意見。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩av综合精品| 国产精品久久久久久一区二区| 色一区av在线| 亚洲第一精品电影| 日韩精品一区二区视频| 亚洲精品中文字幕有码专区| 亚洲自拍偷拍在线| 国产欧美精品一区二区三区介绍| 美女视频久久黄| 日韩av网址在线观看| 久久综合久中文字幕青草| 一区二区三区视频免费| 中文字幕综合在线| 91在线免费网站| 国产精品视频午夜| 97久久伊人激情网| 免费99精品国产自在在线| 欧美在线性视频| 国产精品爱久久久久久久| 国产精品香蕉国产| 97免费中文视频在线观看| 欧美成人剧情片在线观看| 欧美极品少妇xxxxⅹ喷水| 九九精品在线观看| 日韩经典中文字幕在线观看| 欧美区二区三区| 日韩国产欧美精品在线| 亚洲香蕉成视频在线观看| 久久久免费精品| 日韩精品在线观看视频| 亚洲影院在线看| 2020久久国产精品| 国产性猛交xxxx免费看久久| 亚洲国产精品久久久| 亚洲网站视频福利| 日本久久久久久久久久久| 久久在线观看视频| 欧美老女人bb| 亚洲欧美日韩天堂| 国产精品网站入口| 91精品国产高清久久久久久91| 亚洲成人在线视频播放| 黑人巨大精品欧美一区二区三区| 亚洲自拍偷拍一区| 久久免费视频在线观看| 国产日韩欧美视频| 亚洲精品国产品国语在线| 日本不卡视频在线播放| 精品久久久久久中文字幕| 亚洲а∨天堂久久精品喷水| 色综合天天狠天天透天天伊人| 国产69久久精品成人看| 亚洲人成在线观看| 色播久久人人爽人人爽人人片视av| 国产91在线播放九色快色| 久久久女女女女999久久| 国产精品www网站| 懂色av中文一区二区三区天美| 久久精品久久久久久| 日韩亚洲在线观看| 欧美大片欧美激情性色a∨久久| 日韩精品免费电影| 欧美成人网在线| 午夜剧场成人观在线视频免费观看| 国产91精品视频在线观看| 姬川优奈aav一区二区| 亚洲成人久久久| 国产精品激情av在线播放| 亚洲欧美成人在线| 欧美一区二区三区免费观看| 日韩av在线一区| 欧美日韩成人在线视频| 亚洲国产欧美自拍| 97超视频免费观看| 欧美成人免费观看| 国产一区二区三区中文| 色综合男人天堂| 久久理论片午夜琪琪电影网| 亚洲男人天堂网站| 91久久夜色精品国产网站| 精品性高朝久久久久久久| 亚洲xxx大片| 日韩在线免费av| 92裸体在线视频网站| 91久久精品久久国产性色也91| 欧美性生交大片免费| 亚洲日韩欧美视频| 亚洲美女av在线播放| 国产成人精品999| 亚洲天堂av在线播放| 亚洲欧美在线第一页| 欧美情侣性视频| 欧美黄色性视频| 亚洲电影av在线| 亚洲欧洲日产国码av系列天堂| 日韩大胆人体377p| 亚洲国产成人爱av在线播放| 青青精品视频播放| 亚洲欧美一区二区三区情侣bbw| 国产在线观看精品| 国产亚洲美女久久| 久久久人成影片一区二区三区观看| 欧洲亚洲免费视频| 日av在线播放中文不卡| 91免费国产网站| 精品丝袜一区二区三区| 国产v综合ⅴ日韩v欧美大片| 亚洲国产欧美久久| 色噜噜亚洲精品中文字幕| 国产精品劲爆视频| 成人www视频在线观看| 国产精品亚发布| 2020欧美日韩在线视频| 黑人巨大精品欧美一区免费视频| 国产一区二区丝袜| 欧美体内谢she精2性欧美| 中文字幕av一区二区三区谷原希美| 精品日韩美女的视频高清| 国产精品视频成人| 国产精品高精视频免费| 精品国产一区二区三区四区在线观看| 亚洲欧美国产一本综合首页| 91九色国产社区在线观看| 欧美性色xo影院| 精品国产一区二区三区四区在线观看| 日韩免费在线免费观看| 欧美一级电影在线| 久久久电影免费观看完整版| 精品亚洲一区二区三区在线播放| 久久天天躁狠狠躁夜夜躁| 国产精品白嫩美女在线观看| 欧美日韩国产成人高清视频| 亚洲自拍在线观看| 美女性感视频久久久| 欧美一区二区三区艳史| 亚洲精品美女久久久| 亚洲精品国产拍免费91在线| 欧美中文在线视频| 精品亚洲永久免费精品| 456亚洲影院| 亚洲精品视频中文字幕| 国产日产欧美a一级在线| 欧美性色视频在线| 日韩精品中文字幕有码专区| 日韩av观看网址| 亚洲女人被黑人巨大进入al| 久久免费福利视频| 亚洲美女www午夜| 欧美日韩免费看| 18性欧美xxxⅹ性满足| 久久国产加勒比精品无码| 国产免费一区视频观看免费| 欧美xxxx做受欧美.88| 国产精品视频公开费视频| 国产精品一区二区三区免费视频| 人人做人人澡人人爽欧美| 国产一区二区三区网站| 久久人人爽人人| 国产精品福利网| 欧美黄色免费网站| 成人国产精品一区二区| 亚洲国产精品网站| 日韩精品在线视频观看| 在线成人一区二区|