本專題概要
- 一、引言
- 二、實現思路
- 三、實現效果
- 四、小結
一、引言
因為最近在MSDN中的論壇和CSDN論壇都看到有些朋友問到如何用C#實現一個像Windows自帶的圖片查看器的功能等類似的問題(當然還有如何如何旋轉圖片的,如何通過按鈕來變換圖片的功能等),所以為了幫助大家更好地解決類似的這樣的問題,所以這篇文章將簡單介紹下如何使用C#來實現一個圖片查看器的功能的,該工具保存的功能有:
- 可以通過“上一張” “下一張”這樣的按鈕來輪換瀏覽圖片
- 實現對圖片的旋轉
- 實現對旋轉后圖片的保存功能。本程序不僅提供旋轉90/180/270這樣的實現,同時提供一個方法來完成旋轉任意角度的實現
- 該程序未實現Windows圖片查看圖片縮放的功能,這部分的功能主要要點是改變圖片在PictureBox控件中的高度和寬度就可以的
二、實現思路
2.1 圖片輪換瀏覽功能的實現
首先分析下第一個功能點的實現,要實現圖片的輪換瀏覽,我們可以根據下面的思路來實現:
- 第一步、獲得目錄下所有圖片的集合,此時使用Directory.GetFiles()來獲得目錄下所有文件,然后再對該集合進行篩選,篩選出是圖片的文件,代碼用擴展名進行篩選的
- 第二步、獲得所有圖片集合之后,實現圖片輪換就需要改變這個集合的索引就可以實現上一張和下一張的功能了
- 第三步、需要考慮到最后一張或者第一張的情況下,再點擊下一張或上一張圖片來輪換成第一張或最后一張
思路就是上面的,有了上面的思路之后,就讓我們看看具體的代碼來對照理解下:
// 第一步 // 獲得預覽圖片文件路徑下的圖片集合 public static List<string> GetImgCollection(string path) { string[] imgarray = Directory.GetFiles(path); var result = from imgstring in imgarray where imgstring.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) || imgstring.EndsWith("png", StringComparison.OrdinalIgnoreCase)|| imgstring.EndsWith("bmp", StringComparison.OrdinalIgnoreCase) select imgstring; return result.ToList(); } // 第二步 // 獲得打開圖片在圖片集合中的索引 private int GetIndex(string imagepath) { int index = 0; for (int i = 0; i < imgArray.Count; i++) { if (imgArray[i].Equals(imagepath)) { index = i; break; } } return index; } // 切換圖片的方法 private void SwitchImg(int index) { newbitmap = Image.FromFile(imgArray[index]); picBoxView.Image = newbitmap; imgPath = imgArray[index]; } // 第三步 // 上一張圖片 private void btnPre_Click(object sender, EventArgs e) { int index = GetIndex(imgPath); // 釋放上一張圖片的資源,避免保存的時候出現ExternalException異常 newbitmap.Dispose(); if (index == 0) { SwitchImg(imgArray.Count - 1); } else { SwitchImg(index - 1); } } // 下一張圖片 private void btnNext_Click(object sender, EventArgs e) { int index = GetIndex(imgPath); // 釋放上一張圖片的資源,避免保存的時候出現ExternalException異常
// 經常在調用Save方法的時候都會出現 一個GDI一般性錯誤,主要原因是文件沒有被釋放,當保存到原位置時,就會出現該異常,要避免這個錯誤就要釋放圖片占有的資源 newbitmap.Dispose(); if (index != imgArray.Count - 1) { SwitchImg(index + 1); } else { SwitchImg(0); } }
2.2 圖片旋轉功能的實現
上面的代碼實現了第一個功能點的問題了,下面就解釋下如何實現第二個功能點——圖片旋轉的問題:
對於Windows自帶的圖片查看器,它旋轉的角度只能順時針旋轉90或逆時針旋轉90度,這個功能實現起來可以說非常簡單,只需要使用Image.RotateFlip(RotateFlipType)方法就可以完成的,有些朋友也想對圖片實現旋轉任意角度,對於這個問題源碼中也有具體的實現,大家可以從文章的最后下載源碼進行查看,這里就不貼出具體代碼的,下面就看看如何實現Windows自帶的圖片查看器的旋轉功能的代碼:
// 順時針旋轉90度旋轉圖片 private void btnRotate_Click(object sender, EventArgs e) { picBoxView.SizeMode = PictureBoxSizeMode.Zoom; // 順時針旋轉90度的另外一種實現 newbitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); picBoxView.Image = newbitmap; isRotate = true; //newbitmap = (Image)ImageManager.RotateImg(bitmap, 90f, Color.Transparent); ; //bitmap.Dispose(); //picBoxView.Image = newbitmap; } // 逆時針旋轉90度 private void btncounterclockwiseRotate_Click(object sender, EventArgs e) { picBoxView.SizeMode = PictureBoxSizeMode.Zoom; // 逆時針旋轉90度的另外實現 newbitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); picBoxView.Image = newbitmap; isRotate = true; // 下面是旋轉任意角度的代碼 //newbitmap = (Image)ImageManager.RotateImg(bitmap, 360f-90f, Color.Transparent); ; //bitmap.Dispose(); //picBoxView.Image = newbitmap; }
2.3 對旋轉圖片的保存功能的實現
最后就是針對旋轉圖片保存的實現了,此時我參考了Windows自帶圖片查看器的實現方式,因為我用Windows自帶圖片查看器瀏覽圖片的實現,當我旋轉圖片時,它並不是實時地保存到旋轉的圖片的,而是當我關閉Windows自帶圖片查看器的時候,旋轉的圖片才保存到文件中的,有了這個思路之后,我就把我保存的代碼邏輯放在窗體的關閉的事件處理程序中來實現的,此時保存的功能我們只需要調用Image.Save(path)方法就可以完成對圖片的保存,下面就看看具體代碼的實現的:
// 關閉窗體后保存旋轉后的圖片到文件中 private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (imgPath == null || isRotate == false) { return; } // 保存旋轉后的圖片 switch (Path.GetExtension(imgPath).ToLower()) { case ".png": newbitmap.Save(imgPath, ImageFormat.Png); newbitmap.Dispose(); break; case ".jpg": newbitmap.Save(imgPath); newbitmap.Dispose(); break; default: newbitmap.Save(imgPath, ImageFormat.Bmp); newbitmap.Dispose(); break; } }
三、實現效果
上面已經介紹了實現該程序的一個思路的,朋友是不是迫不及待的想看到到底自定義圖片查看器是什么樣子的呢?下面就通過一個動畫來讓大家更形象地看到程序的運行效果的:
四、小結
到這里該文章的內容就介紹結束了,希望大家如果遇到類似的問題可以很快從這篇博客中得到解決,另外附帶下MSDN中這個問題的鏈接:
本專題源碼下載:圖片查看器