我把大家對於ImageList的問題歸納了一下,主要都是關於:
1.ImageList裏面的圖片的顏色
2.ImageList裏面的圖片的大小
/********* 1)ImageList裏面的圖片的顏色的問題 ********/
引起ImageList裏面圖片顏色失真的原因是在Design-Time就在VS.NET中往ImageList裏面添加了Images。
當用戶一邊在“Image Collection Editor”對話框裏面添加圖片,VS.NET一邊就已經把這些圖片裝載到resource文件裏面了。這樣,以後程序運行時就只需要訪問resource文件就可以載入所有圖片而不需要依賴原始的圖片文件。
但是問題在於從結果看,當VS.NET在Design-Time往resource文件裏面添加圖片時並沒有使用用戶指定的ColorDepth(例如Depth32Bit),而用了ImageList.ColorDepth的默認值(Depth8Bit)。這樣,等程序運行時,即使ImageList.ColorDepth指定了Depth32Bit也無濟於事,因爲原始的素材本身只有8bit的顏色。這基本上就是waki的問題的原因。
因此,解決方案是:不在Design-Time用VS.NET往ImageList裏面添加圖片,而是在程序運行時先指定32Bit的ColorDepth,然後再添加圖片,如以下例子代碼:
this.imageList1.ColorDepth=ColorDepth.Depth32Bit;
this.imageList1.Images.Add(Image.FromFile(@"C:\Inetpub\wwwroot\winxp.gif"));
this.imageList1.Images.Add(Image.FromFile(@"C:\Inetpub\wwwroot\images\init_dotnet.gif"));
this.imageList1.Images.Add(Image.FromFile(@"C:\Inetpub\wwwroot\images\mslogo.gif"));
this.imageList1.Images.Add(Image.FromFile(@"C:\Inetpub\wwwroot\images\mslogo2.gif"));
這裏需要注意的是,必須先指定ColorDepth,然後再添加圖片。因爲對ColorDepth賦值會清空所有圖片。BTW,ImageList.ColorDepth的默認值是Depth8Bit,而非文檔上所述Depth4Bit。這一點很容易可以通過寫一段例子代碼來驗證,也可以通過很多Decompiler來查看ImageList的構造函數的實現來驗證。
/********** 2)ImageList裏面的圖片的大小 ************/
的確,通過ImageList.Images[i]獲得圖片的大小都是統一的,都等於ImageList.ImageSize。這個問題的原因在於ImageList在返回Images[i]的過程中並沒有返回原始的圖片,而是按照ImageList.ImageSize創建了一個新的Bitmap,並把原始圖片的內容重新繪製上去以後再返回給用戶。關於這一點,可以用一些Decompiler工具如ILDASM.exe或者Anakrino通過察看私有函數ImageList.GetBitmap(int index)來驗證。我想現在paulluo0739應該能夠理解爲什麼ImageList裏面的圖片都是一樣大的了。
ImageSize同ColorDepth類似,也不宜在運行時改動,一旦重新賦值,就會清空所有的圖片。因此,如果程序運行時需要某一圖片的不同大小的版本,可以考慮使用多個不同ImageSize的ImageList。
ImageList的圖片失真問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
DALFactory有什麼作用
Rshh
2018-08-27 20:02:23
C#跨線程調用窗體控件的問題
Rshh
2018-08-27 20:02:23
C#讀取excel--OLEDB方式
kingbaron
2018-08-27 19:59:47
ASP.NET實用分頁代碼
卤蛋哥
2018-08-27 19:50:29
C#之接口(Interface)
卤蛋哥
2018-08-27 19:50:27
〔C# Note〕面向對象篇
lkisgeek
2018-08-27 19:42:40
RGB,CMYK,HSB各種顏色表示的轉換
Timini
2018-08-27 19:38:33
Linq一些方法整理
侯鸡仔
2018-08-27 19:30:35
ftp圖片上傳下載帶進度條
wellbeingzhang
2018-08-27 19:29:06
GMap.Net根據地址搜索,並雙擊獲得經緯度((Winform)最新版本的代碼)
wellbeingzhang
2018-08-27 19:29:06
VisualStudio App.Config自動配置
北京的雾霾天
2018-08-27 19:27:34
mvc中將視圖輸出成字符串
北京的雾霾天
2018-08-27 19:27:33