天天看點

[C# 開發技巧系列]C#如何實作圖檔檢視器本專題概要一、引言二、實作思路三、實作效果四、小結

一、引言

二、實作思路

三、實作效果

四、小結

因為最近在MSDN中的論壇和CSDN論壇都看到有些朋友問到如何用C#實作一個像Windows自帶的圖檔檢視器的功能等類似的問題(當然還有如何如何旋轉圖檔的,如何通過按鈕來變換圖檔的功能等),是以為了幫助大家更好地解決類似的這樣的問題,是以這篇文章将簡單介紹下如何使用C#來實作一個圖檔檢視器的功能的,該工具儲存的功能有:

可以通過“上一張” “下一張”這樣的按鈕來輪換浏覽圖檔

實作對圖檔的旋轉

實作對旋轉後圖檔的儲存功能。本程式不僅提供旋轉90/180/270這樣的實作,同時提供一個方法來完成旋轉任意角度的實作

該程式未實作Windows圖檔檢視圖檔縮放的功能,這部分的功能主要要點是改變圖檔在PictureBox控件中的高度和寬度就可以的

首先分析下第一個功能點的實作,要實作圖檔的輪換浏覽,我們可以根據下面的思路來實作:

第一步、獲得目錄下所有圖檔的集合,此時使用Directory.GetFiles()來獲得目錄下所有檔案,然後再對該集合進行篩選,篩選出是圖檔的檔案,代碼用擴充名進行篩選的

第二步、獲得所有圖檔集合之後,實作圖檔輪換就需要改變這個集合的索引就可以實作上一張和下一張的功能了

第三步、需要考慮到最後一張或者第一張的情況下,再點選下一張或上一張圖檔來輪換成第一張或最後一張

思路就是上面的,有了上面的思路之後,就讓我們看看具體的代碼來對照了解下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

<code>// 第一步</code>

<code>// 獲得預覽圖檔檔案路徑下的圖檔集合</code>

<code>        </code><code>public</code> <code>static</code> <code>List&lt;</code><code>string</code><code>&gt; GetImgCollection(</code><code>string</code> <code>path)</code>

<code>        </code><code>{</code>

<code>            </code><code>string</code><code>[] imgarray = Directory.GetFiles(path);</code>

<code>            </code><code>var</code> <code>result = </code><code>from</code> <code>imgstring </code><code>in</code> <code>imgarray</code>

<code>                         </code><code>where</code> <code>imgstring.EndsWith(</code><code>"jpg"</code><code>, StringComparison.OrdinalIgnoreCase) ||</code>

<code>                         </code><code>imgstring.EndsWith(</code><code>"png"</code><code>, StringComparison.OrdinalIgnoreCase)||</code>

<code>                         </code><code>imgstring.EndsWith(</code><code>"bmp"</code><code>, StringComparison.OrdinalIgnoreCase)</code>

<code>                         </code><code>select</code> <code>imgstring;</code>

<code>            </code><code>return</code> <code>result.ToList();</code>

<code>        </code><code>}</code>

<code>         </code><code>// 第二步</code>

<code>        </code><code>// 獲得打開圖檔在圖檔集合中的索引</code>

<code>        </code><code>private</code> <code>int</code> <code>GetIndex(</code><code>string</code> <code>imagepath)</code>

<code>            </code><code>int</code> <code>index = 0; </code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; imgArray.Count; i++)</code>

<code>            </code><code>{</code>

<code>                </code><code>if</code> <code>(imgArray[i].Equals(imagepath))</code>

<code>                </code><code>{</code>

<code>                    </code><code>index = i;</code>

<code>                    </code><code>break</code><code>;</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>            </code><code>return</code> <code>index;</code>

<code>        </code><code>// 切換圖檔的方法</code>

<code>        </code><code>private</code> <code>void</code> <code>SwitchImg(</code><code>int</code> <code>index)</code>

<code>            </code><code>newbitmap = Image.FromFile(imgArray[index]);</code>

<code>            </code><code>picBoxView.Image = newbitmap;</code>

<code>            </code><code>imgPath = imgArray[index];</code>

<code>        </code><code>} </code>

<code>        </code><code>// 第三步</code>

<code>         </code><code>// 上一張圖檔</code>

<code>        </code><code>private</code> <code>void</code> <code>btnPre_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>int</code> <code>index = GetIndex(imgPath);</code>

<code>            </code><code>// 釋放上一張圖檔的資源,避免儲存的時候出現ExternalException異常</code>

<code>            </code><code>newbitmap.Dispose();</code>

<code>            </code><code>if</code> <code>(index == 0)</code>

<code>                </code><code>SwitchImg(imgArray.Count - 1);</code>

<code>            </code><code>else</code>

<code>                </code><code>SwitchImg(index - 1);</code>

<code>        </code><code>// 下一張圖檔</code>

<code>        </code><code>private</code> <code>void</code> <code>btnNext_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>// 經常在調用Save方法的時候都會出現 一個GDI一般性錯誤,主要原因是檔案沒有被釋放,當儲存到原位置時,就會出現該異常,要避免這個錯誤就要釋放圖檔占有的資源</code>

<code>            </code><code>if</code> <code>(index != imgArray.Count - 1)</code>

<code>                </code><code>SwitchImg(index + 1);</code>

<code>                </code><code>SwitchImg(0);</code>

上面的代碼實作了第一個功能點的問題了,下面就解釋下如何實作第二個功能點——圖檔旋轉的問題:

對于Windows自帶的圖檔檢視器,它旋轉的角度隻能順時針旋轉90或逆時針旋轉90度,這個功能實作起來可以說非常簡單,隻需要使用Image.RotateFlip(RotateFlipType)方法就可以完成的,有些朋友也想對圖檔實作旋轉任意角度,對于這個問題源碼中也有具體的實作,大家可以從文章的最後下載下傳源碼進行檢視,這裡就不貼出具體代碼的,下面就看看如何實作Windows自帶的圖檔檢視器的旋轉功能的代碼:

<code>// 順時針旋轉90度旋轉圖檔</code>

<code>        </code><code>private</code> <code>void</code> <code>btnRotate_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>picBoxView.SizeMode = PictureBoxSizeMode.Zoom;</code>

<code>                           </code> 

<code>            </code><code>// 順時針旋轉90度的另外一種實作</code>

<code>            </code><code>newbitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);</code>

<code>            </code><code>isRotate = </code><code>true</code><code>;</code>

<code>            </code><code>//newbitmap = (Image)ImageManager.RotateImg(bitmap, 90f, Color.Transparent); ;</code>

<code>            </code><code>//bitmap.Dispose();</code>

<code>            </code><code>//picBoxView.Image = newbitmap;</code>

<code>                      </code> 

<code>        </code><code>// 逆時針旋轉90度</code>

<code>        </code><code>private</code> <code>void</code> <code>btncounterclockwiseRotate_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>                  </code> 

<code>            </code><code>// 逆時針旋轉90度的另外實作</code>

<code>            </code><code>newbitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);</code>

<code>            </code><code>// 下面是旋轉任意角度的代碼</code>

<code>            </code><code>//newbitmap = (Image)ImageManager.RotateImg(bitmap, 360f-90f, Color.Transparent); ;</code>

最後就是針對旋轉圖檔儲存的實作了,此時我參考了Windows自帶圖檔檢視器的實作方式,因為我用Windows自帶圖檔檢視器浏覽圖檔的實作,當我旋轉圖檔時,它并不是實時地儲存到旋轉的圖檔的,而是當我關閉Windows自帶圖檔檢視器的時候,旋轉的圖檔才儲存到檔案中的,有了這個思路之後,我就把我儲存的代碼邏輯放在窗體的關閉的事件處理程式中來實作的,此時儲存的功能我們隻需要調用Image.Save(path)方法就可以完成對圖檔的儲存,下面就看看具體代碼的實作的:

<code>// 關閉窗體後儲存旋轉後的圖檔到檔案中</code>

<code>        </code><code>private</code> <code>void</code> <code>Form1_FormClosed(</code><code>object</code> <code>sender, FormClosedEventArgs e)</code>

<code>            </code><code>if</code> <code>(imgPath == </code><code>null</code> <code>|| isRotate == </code><code>false</code><code>)</code>

<code>                </code><code>return</code><code>;</code>

<code>            </code><code>// 儲存旋轉後的圖檔</code>

<code>            </code><code>switch</code> <code>(Path.GetExtension(imgPath).ToLower())</code>

<code>                </code><code>case</code> <code>".png"</code><code>:</code>

<code>                    </code><code>newbitmap.Save(imgPath, ImageFormat.Png);</code>

<code>                    </code><code>newbitmap.Dispose();</code>

<code>                </code><code>case</code> <code>".jpg"</code><code>:</code>

<code>                    </code><code>newbitmap.Save(imgPath);</code>

<code>                </code><code>default</code><code>:</code>

<code>                    </code><code>newbitmap.Save(imgPath, ImageFormat.Bmp);</code>

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

[C# 開發技巧系列]C#如何實作圖檔檢視器本專題概要一、引言二、實作思路三、實作效果四、小結

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

<a href="http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/89d09d59-ab82-4e41-896f-daab68edbd10">http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/89d09d59-ab82-4e41-896f-daab68edbd10</a>

     本文轉自LearningHard 51CTO部落格,原文連結:http://blog.51cto.com/learninghard/1217177,如需轉載請自行聯系原作者

繼續閱讀