首頁 後端開發 C#.Net教程 C# GDI+程式設計(四)

C# GDI+程式設計(四)

Dec 17, 2016 am 10:11 AM

截圖
Grahpics類別裡的CopyFromScreen函數,可以把螢幕拷貝到Graphics物件裡。如果Graphics物件是從視窗Form建立的,那麼螢幕就直接
顯示在視窗裡。看範例:為視窗新增一個按鈕,然後給這個按鈕新增點選事件處理函數。
函數裡的程式碼如下:
private void button1_Click(object sender, EventArgs e)
 {
  this.CreateGraphics().CopyFromScreen(50,500,70,com }
第一個參數和第二個參數,指明是從螢幕的哪裡開始複製,而後面的0,0,就是把螢幕複製到視窗裡了,從視窗哪裡開始顯示。
this.Size是要複製的大小(寬高)。

是VC++裡的。這裡只不過換了種說法而已。最終的結果還是一樣的。

之前的Graphics物件創建,都是透過視窗的, 這次我們透過圖片來建立Graphics對象,這樣我們就可以在圖片上進行繪製了。

而圖片物件的創建,並不是只有載入文件這一方式。我們可以創建一個「空」位圖(透過建構函數),這種位圖裡面沒有具體的數據,或者說裡面的預設數據,沒有用而已,我們只是需要這麼個容器。在裡面繪圖,新增資料進去。

範例:截圖並將圖片儲存為檔案
private void button1_Click(object sender, EventArgs e)
{
  //建立Bitmap圖片,800寬,600高,如此大小的容器。
 Bitmap bmp = new Bitmap(800, 600);
 //從圖片建立Grahpics物件
 Graphics gr = Graphics.FromImage(bmp); 0, new Size(800, 600), CopyPixelOperation.SourceCopy);
 //儲存為圖片檔案
 bmp.Save("d:\screen.jpg");
}
程式碼就完成了螢幕截圖,並儲存為文件,VC++可是很多行程式碼。另Bitmap是從Image類別衍生出來的。

 

雙緩衝一次繪圖
 直接看一個沒有使用雙緩衝的例子吧,滑鼠在視窗內移動的時候,左上角的長方形就顯示滑鼠目前的位置
    public partial class Form
        {
            InitializeComponent();
    }
        private void formMouseMove(object sender, MouseEventArgs e)
     reateGraphics();
            Rectangle rect = new Rectangle(0, 0 , 100, 35);
            //填充矩形
            LinearGradientBrush brush =
                new LinearGradientBrush(rect, Color.FromArgb(44, 55, 66), Color.FromArgb(123, 150, 189),
                LinearGradientMode.Horizo​​ntal);
gr.FillRectangle(brush, rect);
            //畫矩形
                gr.DrawRectangle(pen, rect);
            //顯示內
      Drawing.Text.TextRenderingHint.AntiAlias;
            String str = String.Format("滑鼠位置:n{0},{1}", e.X, String.Format("滑鼠位置:n{0},{1}", e.X, e.Format("滑鼠位置:n{ new Font("黑體", 11 ),Brushes.White, rect);
        }
    }
可以看到,當滑鼠移動的時候,左上角的矩形明顯閃爍了,這是因為進行了三次繪製,填充矩形,畫矩形,顯示文字。才導致的。
當繪製的次數越多,這個閃爍就越明顯。
而這三次繪製最終只要得到一個結果,也就是得到一張圖片,那麼我們就可以使用雙緩衝來完成了,先把要繪製的圖形繪製到Bitmap裡面。然後再把Bitmap畫到視窗就行了。
看範例:
        private void formMouseMove(object sender, MouseEventArgs e)
     this.CreateGraphics();
            //從Bitmap建立Graphics物件
               Graphics gr = Graphics.FromImage(bmp);
            Rectangle rect = new Rectangle(0,  100, 3555);            LinearGradientBrush brush =
               , Color.FromArgb(123, 150, 189),
                ect);
            //畫以長方形
Pen pen = new Pen(Color.Green, 2);
            gr.Dr.awRectangle(pen, rect);      gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            String str ("滑鼠位置:n{0},{1}", e.X, e.Y);
            rush.DrawString(str, new Font("黑體",11),B5.DrawString(str, new Font("黑體",11),B5.DrawString,   //一次性繪製
            graphics.DrawImage(bmp, 0, 0);
        }

);它屬於Control類,而視窗類別和控制項類別都是從Control類別衍生出來的。

看範例:(一個按鈕點選事件處理函數的程式碼)
private void button1_Click(object sender, EventArgs e)
{

 Bitmap bmp =R0cm>B55(Fitcop)(Fv),Fv5,0,05p 0, 0, Width, Height));

 bmp.Save("d:\form.jpg");
}
DrawToBitmap的第二個參數,是視窗顯示在Bitmap裡的區域。這個是不能縮小或放大圖片的,視窗的大小和Bitmap的大小是一致的,
如果填10,10,50,50那就是視窗的0,0,50,50顯示在點陣圖的10,10, 50,50矩形區域內,視窗起始位置是不是能指定的,只能從位置0,0開始。

取得一個像素點的值
Bitmap類別裡GetPixel函數可以取得一個像素點的Color值,如果要取得視窗某一個像素點的顏色值,可以先呼叫DrawToBitmap函數,把
視窗儲存成Bitmap。然後再獲取。另:也有對應的函數SetPixel設定一個像素的顏色值。

取得Png圖片顯示區域,建立不規則視窗。
取得Png圖片區域可以用GetPixel函數,取得圖片裡每一個像素點的顏色值,如果Alpha值為0的話,那就是透明的,否則把這個點加入區域。那麼要如何取得一個Color物件的Alpah值呢,呼叫ToArgb成員函數,這個是32位元整數,剛好可以儲存4個8位元組的數值:A,R,G,B。

看下範例吧,把Alpha值提煉出來

{
 Color cor1 = Color.FromArgb(123,225,229,230);
 ///食Cor的argb值(CC

值)。 byte[] bargb = BitConverter.GetBytes(argb);

 //bargb[3]儲存的是Alpha值
 String str = String.Format("{0},{1},{2},{3}", bargb[0], bargb[1], bargb[2], bargb[3]);
 MessageBox.Show(str);
}
一個完整的範例,取得PNG顯示區域

範例程式碼: 

public Form1()
        {
            InitializeComponent();          GraphicsPath path = new GraphicsPath();
             age\ win.png");
            //判斷每個像素的顏色值,以取得圖片的顯示區域
                       for (int x = 0; x                 {
                               int argb = cor.ToArgb();
      etBytes(argb);
                    //像素色彩值不是透明的
                    if (bargb[3] != 0)                    //將這個像素點區域加入路徑裡去
          y, 1, 1));
                    }
          }
      //設定視窗顯示區域,透過路徑建立區域
            this.Region = new Region(path);
        得不到想要的外觀結果。雖然看著PNG圖片裡有些地方好像是透明的。
解決方法就是自己來做PNG圖片,照自己的規則來。不要從網路上找。

設定了不規則窗口,就可以把那張PNG圖片繪製到窗口裡去了,但由於半透明的問題,得先用透明畫刷填充窗口,然後再繪製。

不過還有一個問題,非客戶區視窗繪製,像我們之前的繪製,都是在窗口客戶區裡繪製的。

如果要繪製的圖片和視窗對應起來的話,得從非客戶區域開始繪製。這個怎麼做到。下一章再說吧。


更多C# GDI+程式設計(四)相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
c#.net的持續相關性:查看當前用法 c#.net的持續相關性:查看當前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

從網絡到桌面:C#.NET的多功能性 從網絡到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#作為多功能.NET語言:應用程序和示例 C#作為多功能.NET語言:應用程序和示例 Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

c#.net適合您嗎?評估其適用性 c#.net適合您嗎?評估其適用性 Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#.NET與未來:適應新技術 C#.NET與未來:適應新技術 Apr 14, 2025 am 12:06 AM

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

.NET中的C#代碼:探索編程過程 .NET中的C#代碼:探索編程過程 Apr 12, 2025 am 12:02 AM

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

將C#.NET應用程序部署到Azure/AWS:逐步指南 將C#.NET應用程序部署到Azure/AWS:逐步指南 Apr 23, 2025 am 12:06 AM

如何將C#.NET應用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。 1.在Azure上,使用AzureAppService和AzurePipelines自動化部署。 2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda實現部署和無服務器計算。

C#和.NET運行時:它們如何一起工作 C#和.NET運行時:它們如何一起工作 Apr 19, 2025 am 12:04 AM

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

See all articles