1. 程式人生 > 程式設計 >c# 實現圖片檢視器

c# 實現圖片檢視器

一、引言

因為最近在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;
   }
  }

三、實現效果

上面已經介紹了實現該程式的一個思路的,朋友是不是迫不及待的想看到到底自定義圖片檢視器是什麼樣子的呢?下面就通過一個動畫來讓大家更形象地看到程式的執行效果的:

c# 實現圖片檢視器

四、小結

到這裡該文章的內容就介紹結束了,希望大家如果遇到類似的問題可以很快從這篇部落格中得到解決,另外附帶下MSDN中這個問題的連結:

http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/89d09d59-ab82-4e41-896f-daab68edbd10

以上就是c# 實現圖片檢視器的詳細內容,更多關於c# 圖片檢視器的資料請關注我們其它相關文章!