[C# 開發技巧系列]C#如何實現圖片查看器

本專題概要

  • 1、引言c#

  • 2、實現思路ide

  • 3、實現效果工具

  • 4、小結動畫

1、引言

由於最近在MSDN中的論壇和CSDN論壇都看到有些朋友問到如何用C#實現一個像Windows自帶的圖片查看器的功能等相似的問題(固然還有如何如何旋轉圖片的,如何經過按鈕來變換圖片的功能等),因此爲了幫助你們更好地解決相似的這樣的問題,因此這篇文章將簡單介紹下如何使用C#來實現一個圖片查看器的功能的,該工具保存的功能有:spa

  1. 能夠經過「上一張」 「下一張」這樣的按鈕來輪換瀏覽圖片code

  2. 實現對圖片的旋轉orm

  3. 實現對旋轉後圖片的保存功能。本程序不只提供旋轉90/180/270這樣的實現,同時提供一個方法來完成旋轉任意角度的實現索引

  4. 該程序未實現Windows圖片查看圖片縮放的功能,這部分的功能主要要點是改變圖片在PictureBox控件中的高度和寬度就能夠的事件

2、實現思路

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 p_w_picpathpath)
        {
            int index = 0;  
            for (int i = 0; i < imgArray.Count; i++)
            {
                if (imgArray[i].Equals(p_w_picpathpath))
                {
                    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;
            }
        }

3、實現效果

上面已經介紹了實現該程序的一個思路的,朋友是否是火燒眉毛的想看到到底自定義圖片查看器是什麼樣子的呢?下面就經過一個動畫來讓你們更形象地看到程序的運行效果的:


4、小結

到這裏該文章的內容就介紹結束了,但願你們若是遇到相似的問題能夠很快從這篇博客中獲得解決,另外附帶下MSDN中這個問題的連接:

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

本專題×××:圖片查看器

相關文章
相關標籤/搜索