ImageList的圖片失真問題

我把大家對於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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章