C# 系统应用之ListView实现简单图片浏览器
??????? 最近有同學問我如何使用ListView加載圖片列表,前面在"C#系統應用"中TreeView+ListView+ContextMenuStrip控件實現樹狀圖顯示磁盤目錄,并在ListView中顯示文件的詳細信息.這里準備簡單介紹下給同學講述的如何使用ListView+ImageList控件實現簡單的圖片瀏覽器知識.
?????? 第一步?設計界面框架如下圖所示,同時添加ImageList控件(不可見)
?
??????? 注意:設置ListView控件的Anchor屬性為Top,Bottom,Right;設置PictureBox的Anchor屬性為上下左右.
???????第二步 使用OpenFileDialog控件打開顯示圖片
????????圖片顯示效果如下圖所示,需要注意的是在使用FromFile顯示圖片,可能圖片全屏顯示時會出現只出現部分圖片現象,我設置圖片為可拉伸或收縮StretchImage模式.
???????第三步?顯示圖片列表至ListView控件中
??????? 主要通過控件FolderBrowserDialog控件打開文件夾,同時獲取文件夾的路徑;在通過GetFiles("*.jpg")函數獲取jpg格式圖片,并獲取文件夾中文件增加至ImageList中,設置ListView的View屬性格式為LargeIcon大圖標格式顯示.
??????? 顯示結果如下圖所示:
?
????????需要注意的是:
??????? 1.使用ListView加載信息的幾個步驟:獲取文件夾路徑 -> DirectoryInfo獲取目錄 -> GetFiles獲取文件 -> Add圖片至ImageList -> Add圖片至ListView.
??????? 2.在設置ListView中圖片的大小時,使用imageList1.ImageSize = new Size(40, 40)賦值失敗,我是通過修改ImageList1的ImageSize屬性為(64,64)實現的.
??????? 3.顯示ListView中圖片,通常會出現失真的情況,主要原因參考博客:ListView顯示圖片失真.
????????主要概括為ImageList里面圖片顏色失真和圖片大小失真,其中圖片顏色失真原因是Design-Time在VS.NET中添加圖片時沒有使用用戶指定的ColorDepth(如Depth32Bit),而用了ImageList.ColorDepth的默認值(Depth8Bit).因此需要先設置圖片顏色深度,在再往ImageList中添加圖片,而圖片大小統一的都等于ImageList.ImageSize.
???????第四步 通過listView1_DoubleClick函數雙擊打開圖片
????????在Form1.cs[設計]中ListView屬性頁為其添加DoubleClick雙擊事件,并通過Image.FromFile顯示圖片.
??????? 雙擊列表中不同圖片的顯示效果如下圖所示:
? ? ? ? 其中需要注意的是,我在列表中顯示圖片重命名為"pic+數字",同時定義變量記錄文件夾中圖片真實路徑與其一一對應.private List<string> imagePathList = new List<string>().這里使用index顯示對應圖片即可,同樣顯示上一張\下一張相同.
???????第五步 顯示上一張\下一張
??????? 文章寫到此處基本內容完成,內容比較簡單,但也構成了一個完整的圖片瀏覽器.同時很多時候我們需要上傳縮略圖,可以調用下面函數(在線筆記):
//添加命名空間 using System.Drawing.Drawing2D;??? //CompositingQuality.HighQuality using System.Drawing.Imaging;????? //EncoderParameter/// <SUMMARY> /// 圖片無損縮放 自定義函數生成縮略圖 /// </SUMMARY> /// <PARAM name="sourceFile">圖片源路徑</PARAM> /// <PARAM name="destFile">縮放后圖片輸出路徑</PARAM> /// <PARAM name="destHeight">縮放后圖片高度</PARAM> /// <PARAM name="destWidth">縮放后圖片寬度</PARAM> /// <RETURNS></RETURNS> public static bool GetThumbnail(string sourceFile, string destFile, int destHeight, int destWidth) {System.Drawing.Image imgSource = System.Drawing.Image.FromFile(sourceFile);System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;int sW = 0, sH = 0;// 按比例縮放int sWidth = imgSource.Width;int sHeight = imgSource.Height;if (sHeight > destHeight || sWidth > destWidth){if ((sWidth * destHeight) > (sHeight * destWidth)){sW = destWidth;sH = (destWidth * sHeight) / sWidth;}else{sH = destHeight;sW = (sWidth * destHeight) / sHeight;}}else{sW = sWidth;sH = sHeight;}//新建一個bmp圖片 Bitmap outBmp = new Bitmap(destWidth, destHeight);//新建一個畫板Graphics g = Graphics.FromImage(outBmp);//清空畫布并以透明背景色填充 Color.Black黑色填充g.Clear(System.Drawing.Color.Transparent);//設置畫布的描繪質量g.CompositingQuality = CompositingQuality.HighQuality;//設置高質量,低速度呈現平滑程度g.SmoothingMode = SmoothingMode.HighQuality;//設置高質量插值法g.InterpolationMode = InterpolationMode.HighQualityBicubic;//在指定位置并且按指定大小繪制原圖片的指定部分g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);g.Dispose();//以下代碼為保存圖片時 設置壓縮質量EncoderParameters encoderParams = new EncoderParameters();long[] quality = new long[1];quality[0] = 100;EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);encoderParams.Param[0] = encoderParam;try{//獲得包含有關內置圖像編碼解碼器的信息的ImageCodecInfo對象ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();ImageCodecInfo jpegICI = null;for (int x = 0; x < arrayICI.Length; x++){if (arrayICI[x].FormatDescription.Equals("JPEG")){jpegICI = arrayICI[x]; //設置JPEG編碼break;}}//保存為JPG格式圖片if (jpegICI != null){outBmp.Save(destFile, jpegICI, encoderParams);}else{outBmp.Save(destFile, thisFormat);}return true;}catch(Exception e){throw e;}finally{imgSource.Dispose();outBmp.Dispose();} }????????總結:本文主要是根據給同學講解ListView控件顯示圖片寫的一篇文章,同時存在一個缺點圖片可能被扯拉變形,而且代碼中打開ListView圖片時有個"打開時間",主要是通過Stopwatch記錄批量打開圖片所需時間,如果打開大量圖片時我希望使用并行的方法實現,與其進行時間對比.同時如果對圖片處理感興趣的同學(C++通過Bitmap打開變換)自己可以去研究.我希望的顯示效果想Google Picasa一樣快速批量顯示(研究ing).
????????下載地址:http://download.csdn.net/detail/eastmount/8021077
????????最后希望文章對大家有所幫助,如果有錯誤或不足之處,請海涵~
????????(By:Eastmount 2014-10-10 中午13點?原創CSDN?http://blog.csdn.net/eastmount/)
總結
以上是生活随笔為你收集整理的C# 系统应用之ListView实现简单图片浏览器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Python学习] 专题四.文件基础知
- 下一篇: C# 系统应用之鼠标模拟技术及自动操作鼠