日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Winform 窗体美化(八、Icon)

發(fā)布時間:2025/3/11 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Winform 窗体美化(八、Icon) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

八、Icon

之前 Winform 項目也有在 Icon 上遇到些問題(這里的 Icon 指的是 .ico 類型的文件),比如剛開始不知道怎么讓自己的程序 Icon 和其他軟件一樣可以放大,還有放大之后在音量合成器中會出現(xiàn)比較奇葩的效果之類的問題,這里簡單整理下,以后再有其他問題再補充。

1、C# 代碼轉(zhuǎn)換 Icon 格式

最開始寫 Winform 程序的時候,程序圖標(biāo)都是從網(wǎng)上 down 的,因為那時候我下載了個精簡版的ps cs3 里面不能保存 ico 文件,后來我找了個可以用 ps cs3 保存 ico 文件的插件,就可以保存 Ico 格式的文件了,最近突發(fā)奇想能不能用 C# 代碼來轉(zhuǎn)換 Icon 格式,這個例子在網(wǎng)上看過,有個網(wǎng)站可以將 Png 轉(zhuǎn)換成 Ico,OK 既然有就可以試驗一下。

網(wǎng)上最多的代碼就是:

Bitmap iconBm = new Bitmap(oriImage, size); Icon icon = Icon.FromHandle(iconBm.GetHicon()); //保存文件省略

這玩意兒確實能生成 Ico 格式的文件,但是這真的是個坑,因為生成的 Ico 是這樣的:

網(wǎng)上有這種困擾的人很多,大致看了下原因是顏色位數(shù)的問題,那肯定的,顏色少的也太多了……

不過隨后找到一個文章,完美的做好了轉(zhuǎn)換,引用地址:http://www.cnblogs.com/ahdung/p/ConvertToIcon.html

Icon 文件說明:https://msdn.microsoft.com/en-us/library/ms997538.aspx

作者的方法原理是:先將image編碼為png;再將png原樣包裝成一個icon。在這要謝謝作者提供的方法,提供了新思路,完美解決問題。

這里順便一貼方法代碼(Save 方法是我順手補的……):

/// <summary> /// 將 Image(PNG) 保存到指定目錄文件名的 Icon /// </summary> /// <param name="image"></param> /// <param name="file"></param> /// <returns></returns> public static bool Save(Image image, string file) {if (image != null){using (Icon icon = ConvertToIcon(image)){try{FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write);icon.Save(fs);fs.Flush();fs.Close();fs.Dispose();return true;}catch { }}}return false; }/// <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保留。必須為0bin.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);}} }

這個方法所轉(zhuǎn)換的 Icon 是無損帶透明的完美效果。

注:這里補充個小代碼,是 OpenFileDialog 選擇文件的:

OpenFileDialog 中可以設(shè)置 Filter 屬性,默認不設(shè)置則可以選擇所有文件,也可以限制只選自己需要的文件類型。
1. 限制一種文件類型:Filter=”照片|*.jpg”;
2. 限制同類多種文件類型:Filter=”照片|*.jpg;*jpeg;*png”;
3. 限制多種分類文件類型:Filter=”照片|.jpg;*jpeg;*png|音頻|.mp3”;

代碼如下:

//彈出打開圖片對話框 OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Filter = "圖片文件|*.jpg;*.jpeg;*.png"; if (fileDialog.ShowDialog() == DialogResult.OK) {//選擇圖片進行加載oriImagePath = fileDialog.FileName; }

2、可放大的程序圖標(biāo)

用過 win7 的小伙伴大部分應(yīng)該都知道的,按住 ctrl 鍵 + 鼠標(biāo)滾輪 可以對程序圖標(biāo)放大縮小,但是固定尺寸的程序圖標(biāo)就不會跟著放大縮小,如圖:

這種問題其實倒還是簡單,因為 Icon 文件中可以放不同分辨率的圖像,只需要在文件中創(chuàng)建高分辨率的版本就可以了:

創(chuàng)建多個分辨率的 Icon 之后,就不怕縮放問題了:

3、音量合成器的 Icon

沉積在可以放大圖標(biāo)的喜悅中之后,在給程序加聲音的工作中,突然發(fā)現(xiàn)了個奇葩的東西:

我去~這是個什么鬼,在網(wǎng)上沒查到是什么原因,我真是不知道怎么來描述這個問題……不過可以肯定是出在大分辨率的 Icon 上,既然這樣,就再增加小分辨率的 Icon 進去。

實驗發(fā)現(xiàn),增加48*48大小的 Icon 就可以恢復(fù)正常了,如圖:

4、IcoFX

IcoFX 確實是款不錯的 Ico 文件編輯工具,上面的例子我也是用了這個軟件編輯的 Ico,相比 visual studio 中的圖像編輯器,IcoFX 操作更方便些,感興趣的同學(xué)可以下載學(xué)習(xí)一下,軟件有試用期,但是畢竟有注冊機之類的神器啊,百度一下就可以了。

總結(jié)

以上是生活随笔為你收集整理的C# Winform 窗体美化(八、Icon)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。