C#中把Image無損轉換為Icon的執行個體詳解

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了C#無損轉換Image為Icon的方法,具有一定的參考價值,感興趣的小夥伴們可以參考一下

如題,市面上常見的方法是:

var handle = bmp.GetHicon();  //得到表徵圖控制代碼return Icon.FromHandle(handle); //通過控制代碼得到表徵圖

此法的問題是,如果映像是透明背景,那麼得到的Icon的邊緣就是毛糙的,像是先墊了一層背景色然後再去色的效果,很不如人意,用過的朋友都知道。尚未研究是bmp.GetHicon出的問題,還是Icon.FromHandle有問題,日後有閑心再搗鼓下。

下面給出完美轉換方法:

/// <summary>/// 轉換Image為Icon/// </summary>/// <param name="image">要轉換為表徵圖的Image對象</param>/// <param name="nullTonull">當image為null時是否返回null。false則拋Null 參考異常</param>/// <exception cref="ArgumentNullException" />public static Icon ConvertToIcon(Image image, bool nullTonull = false){  if (image == null)  {    if (nullTonull) { return null; }    throw new ArgumentNullException("image");  }  using (MemoryStream msImg = new MemoryStream()           , msIco = new MemoryStream())  {    image.Save(msImg, ImageFormat.Png);    using (var bin = new BinaryWriter(msIco))    {      //寫表徵圖頭部      bin.Write((short)0);      //0-1保留      bin.Write((short)1);      //2-3檔案類型。1=表徵圖, 2=游標      bin.Write((short)1);      //4-5映像數量(表徵圖可以包含多個映像)      bin.Write((byte)image.Width); //6表徵圖寬度      bin.Write((byte)image.Height); //7表徵圖高度      bin.Write((byte)0);      //8顏色數(若像素位深>=8,填0。這是顯然的,達到8bpp的顏色數最少是256,byte不夠表示)      bin.Write((byte)0);      //9保留。必須為0      bin.Write((short)0);      //10-11調色盤      bin.Write((short)32);     //12-13位深      bin.Write((int)msImg.Length); //14-17位元影像資料大小      bin.Write(22);         //18-21位元影像資料起始位元組      //寫映像資料      bin.Write(msImg.ToArray());      bin.Flush();      bin.Seek(0, SeekOrigin.Begin);      return new Icon(msIco);    }  }}

如碼所示,方法的原理是:

1、先將image編碼為png
2、再將png原樣封裝成一個icon

第1步雖然是重編碼,但png是無損格式,映像品質不會有絲毫損失。然後在二進位層面原封不動的把轉換得到的png塞入表徵圖。所以整個方法擔得起【無損】的說法,介意失真的朋友請放心使用。注意:方法中並未對原圖size做檢查、處理,所以請先確保原圖的尺寸符合表徵圖規格再傳入;另外,不負責銷毀原圖,請調用者在外部負責。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.