最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#無損轉(zhuǎn)換Image為Icon的方法

 更新時間:2017年04月01日 10:14:24   作者:AhDung  
這篇文章主要為大家詳細介紹了C#無損轉(zhuǎn)換Image為Icon的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

var handle = bmp.GetHicon();  //得到圖標(biāo)句柄
return Icon.FromHandle(handle); //通過句柄得到圖標(biāo)

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

下面給出完美轉(zhuǎn)換方法:

/// <summary>
/// 轉(zhuǎn)換Image為Icon
/// </summary>
/// <param name="image">要轉(zhuǎn)換為圖標(biāo)的Image對象</param>
/// <param name="nullTonull">當(dāng)image為null時是否返回null。false則拋空引用異常</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))
    {
      //寫圖標(biāo)頭部
      bin.Write((short)0);      //0-1保留
      bin.Write((short)1);      //2-3文件類型。1=圖標(biāo), 2=光標(biāo)
      bin.Write((short)1);      //4-5圖像數(shù)量(圖標(biāo)可以包含多個圖像)

      bin.Write((byte)image.Width); //6圖標(biāo)寬度
      bin.Write((byte)image.Height); //7圖標(biāo)高度
      bin.Write((byte)0);      //8顏色數(shù)(若像素位深>=8,填0。這是顯然的,達到8bpp的顏色數(shù)最少是256,byte不夠表示)
      bin.Write((byte)0);      //9保留。必須為0
      bin.Write((short)0);      //10-11調(diào)色板
      bin.Write((short)32);     //12-13位深
      bin.Write((int)msImg.Length); //14-17位圖數(shù)據(jù)大小
      bin.Write(22);         //18-21位圖數(shù)據(jù)起始字節(jié)

      //寫圖像數(shù)據(jù)
      bin.Write(msImg.ToArray());

      bin.Flush();
      bin.Seek(0, SeekOrigin.Begin);
      return new Icon(msIco);
    }
  }
}

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

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

第1步雖然是重編碼,但png是無損格式,圖像質(zhì)量不會有絲毫損失。然后在二進制層面原封不動的把轉(zhuǎn)換得到的png塞入圖標(biāo)。所以整個方法擔(dān)得起【無損】的說法,介意失真的朋友請放心使用。注意:方法中并未對原圖size做檢查、處理,所以請先確保原圖的尺寸符合圖標(biāo)規(guī)格再傳入;另外,不負責(zé)銷毀原圖,請調(diào)用者在外部負責(zé)。

下面是閑扯:

為了解決這個問題還真費了番功夫,stackoverflow、codeproject等神跡多現(xiàn)的地方逛了幾圈都沒找到如意的法子,思索一番后感覺可以從圖標(biāo)格式上嘗試,然后在萬能的msdn果然找到一篇講icon格式的文檔:https://msdn.microsoft.com/en-us/library/ms997538.aspx,還好不算很難理解,一番嘗試之下,方法出爐。

-文畢-

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Unity UGUI的EventTrigger事件監(jiān)聽器組件介紹使用示例

    Unity UGUI的EventTrigger事件監(jiān)聽器組件介紹使用示例

    這篇文章主要為大家介紹了Unity UGUI的EventTrigger事件監(jiān)聽器組件介紹及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • C#中跨線程訪問控件的實現(xiàn)方法

    C#中跨線程訪問控件的實現(xiàn)方法

    C#中不允許跨線程直接訪問界面控件,即一個線程中如主線程創(chuàng)建的控件不允許被其他線程例如子線程直接訪問,在一個線程中設(shè)置其他線程所有的控件屬性通常有兩種方法,本文將詳細的給大家介紹一下,需要的朋友可以參考下
    2024-12-12
  • c#代碼自動修改解決方案下任意文件實例

    c#代碼自動修改解決方案下任意文件實例

    這篇文章主要介紹了c#代碼自動修改解決方案下任意文件實例,有需要的朋友可以參考一下
    2013-11-11
  • C#調(diào)用WebService實例開發(fā)

    C#調(diào)用WebService實例開發(fā)

    那么,我們怎么在項目中調(diào)用WebService這個方法呢,其實這和調(diào)用天氣的webservice是一個道理,首先,通過添加“web服務(wù) 引用”將,你寫的webservice引用進來,我們需要注意的是其中有一處要我們填寫請求webservice的URL地址,我們該怎么寫?
    2015-09-09
  • C# 的關(guān)鍵字詳細介紹

    C# 的關(guān)鍵字詳細介紹

    本文將詳細介紹C#關(guān)鍵字的應(yīng)用,可供有需要的朋友參考
    2012-11-11
  • C# 從枚舉值獲取對應(yīng)的文本描述詳解

    C# 從枚舉值獲取對應(yīng)的文本描述詳解

    這篇文章主要介紹了C# 從枚舉值獲取對應(yīng)的文本描述詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C#如何調(diào)用MFC 窗口 DLL

    C#如何調(diào)用MFC 窗口 DLL

    這篇文章主要介紹了C#如何調(diào)用MFC 窗口 DLL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • C#使用泛型方法設(shè)計實現(xiàn)單向鏈表詳解

    C#使用泛型方法設(shè)計實現(xiàn)單向鏈表詳解

    這篇文章主要為大家詳細介紹了C#如何使用泛型方法設(shè)計實現(xiàn)一個單向鏈表,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C#多線程系列之線程池

    C#多線程系列之線程池

    本文詳細講解了C#多線程中的線程池,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • c# 模擬串口通信 SerialPort的實現(xiàn)示例

    c# 模擬串口通信 SerialPort的實現(xiàn)示例

    本文主要介紹了c# 模擬串口通信 SerialPort的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論

镇原县| 安岳县| 德化县| 正安县| 名山县| 富平县| 阿尔山市| 漾濞| 驻马店市| 双城市| 海兴县| 黄平县| 康定县| 阿坝| 仙居县| 马鞍山市| 荔浦县| 垫江县| 聂拉木县| 永胜县| 芷江| 确山县| 确山县| 阳泉市| 安顺市| 通河县| 元江| 岳池县| 家居| 佛冈县| 淮北市| 通渭县| 砀山县| 团风县| 吉水县| 怀柔区| 徐闻县| 清河县| 米林县| 加查县| 仁布县|