国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#如何實(shí)現(xiàn)圖片查看器

2019-10-29 21:30:07
字體:
供稿:網(wǎng)友
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)圖片查看器的相關(guān)方法,C#實(shí)現(xiàn)一個像Windows自帶的圖片查看器的功能,感興趣的小伙伴們可以參考一下
 

這篇文章將簡單介紹下如何使用C#來實(shí)現(xiàn)一個圖片查看器的功能的,該工具保存的功能有:

1、 可以通過“上一張” “下一張”這樣的按鈕來輪換瀏覽圖片
 2、實(shí)現(xiàn)對圖片的旋轉(zhuǎn)
 3、實(shí)現(xiàn)對旋轉(zhuǎn)后圖片的保存功能。本程序不僅提供旋轉(zhuǎn)90/180/270這樣的實(shí)現(xiàn),同時提供一個方法來完成旋轉(zhuǎn)任意角度的實(shí)現(xiàn)
4、該程序未實(shí)現(xiàn)Windows圖片查看圖片縮放的功能,這部分的功能主要要點(diǎn)是改變圖片在PictureBox控件中的高度和寬度就可以的
二、實(shí)現(xiàn)思路
2.1 圖片輪換瀏覽功能的實(shí)現(xiàn)
首先分析下第一個功能點(diǎn)的實(shí)現(xiàn),要實(shí)現(xiàn)圖片的輪換瀏覽,我們可以根據(jù)下面的思路來實(shí)現(xiàn):

第一步、獲得目錄下所有圖片的集合,此時使用Directory.GetFiles()來獲得目錄下所有文件,然后再對該集合進(jìn)行篩選,篩選出是圖片的文件,代碼用擴(kuò)展名進(jìn)行篩選的
第二步、獲得所有圖片集合之后,實(shí)現(xiàn)圖片輪換就需要改變這個集合的索引就可以實(shí)現(xiàn)上一張和下一張的功能了
第三步、需要考慮到最后一張或者第一張的情況下,再點(diǎn)擊下一張或上一張圖片來輪換成第一張或最后一張
思路就是上面的,有了上面的思路之后,就讓我們看看具體的代碼來對照理解下:

// 第一步// 獲得預(yù)覽圖片文件路徑下的圖片集合  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);   // 釋放上一張圖片的資源,避免保存的時候出現(xiàn)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);   // 釋放上一張圖片的資源,避免保存的時候出現(xiàn)ExternalException異常   // 經(jīng)常在調(diào)用Save方法的時候都會出現(xiàn) 一個GDI一般性錯誤,主要原因是文件沒有被釋放,當(dāng)保存到原位置時,就會出現(xiàn)該異常,要避免這個錯誤就要釋放圖片占有的資源   newbitmap.Dispose();   if (index != imgArray.Count - 1)   {    SwitchImg(index + 1);   }   else   {    SwitchImg(0);   }  }

2.2 圖片旋轉(zhuǎn)功能的實(shí)現(xiàn)
上面的代碼實(shí)現(xiàn)了第一個功能點(diǎn)的問題了,下面就解釋下如何實(shí)現(xiàn)第二個功能點(diǎn)——圖片旋轉(zhuǎn)的問題:

對于Windows自帶的圖片查看器,它旋轉(zhuǎn)的角度只能順時針旋轉(zhuǎn)90或逆時針旋轉(zhuǎn)90度,這個功能實(shí)現(xiàn)起來可以說非常簡單,只需要使用Image.RotateFlip(RotateFlipType)方法就可以完成的,有些朋友也想對圖片實(shí)現(xiàn)旋轉(zhuǎn)任意角度,對于這個問題源碼中也有具體的實(shí)現(xiàn),大家可以從文章的最后下載源碼進(jìn)行查看,這里就不貼出具體代碼的,下面就看看如何實(shí)現(xiàn)Windows自帶的圖片查看器的旋轉(zhuǎn)功能的代碼:

 // 順時針旋轉(zhuǎn)90度旋轉(zhuǎn)圖片  private void btnRotate_Click(object sender, EventArgs e)  {   picBoxView.SizeMode = PictureBoxSizeMode.Zoom;      // 順時針旋轉(zhuǎn)90度的另外一種實(shí)現(xiàn)   newbitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);   picBoxView.Image = newbitmap;   isRotate = true;   //newbitmap = (Image)ImageManager.RotateImg(bitmap, 90f, Color.Transparent); ;   //bitmap.Dispose();   //picBoxView.Image = newbitmap;  }    // 逆時針旋轉(zhuǎn)90度  private void btncounterclockwiseRotate_Click(object sender, EventArgs e)  {   picBoxView.SizeMode = PictureBoxSizeMode.Zoom;    // 逆時針旋轉(zhuǎn)90度的另外實(shí)現(xiàn)   newbitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);   picBoxView.Image = newbitmap;   isRotate = true;   // 下面是旋轉(zhuǎn)任意角度的代碼   //newbitmap = (Image)ImageManager.RotateImg(bitmap, 360f-90f, Color.Transparent); ;   //bitmap.Dispose();   //picBoxView.Image = newbitmap;  }

2.3 對旋轉(zhuǎn)圖片的保存功能的實(shí)現(xiàn)
最后就是針對旋轉(zhuǎn)圖片保存的實(shí)現(xiàn)了,此時我參考了Windows自帶圖片查看器的實(shí)現(xiàn)方式,因?yàn)槲矣肳indows自帶圖片查看器瀏覽圖片的實(shí)現(xiàn),當(dāng)我旋轉(zhuǎn)圖片時,它并不是實(shí)時地保存到旋轉(zhuǎn)的圖片的,而是當(dāng)我關(guān)閉Windows自帶圖片查看器的時候,旋轉(zhuǎn)的圖片才保存到文件中的,有了這個思路之后,我就把我保存的代碼邏輯放在窗體的關(guān)閉的事件處理程序中來實(shí)現(xiàn)的,此時保存的功能我們只需要調(diào)用Image.Save(path)方法就可以完成對圖片的保存,下面就看看具體代碼的實(shí)現(xiàn)的:

 // 關(guān)閉窗體后保存旋轉(zhuǎn)后的圖片到文件中  private void Form1_FormClosed(object sender, FormClosedEventArgs e)  {   if (imgPath == null || isRotate == false)   {    return;   }   // 保存旋轉(zhuǎn)后的圖片   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;   }  }

三、實(shí)現(xiàn)效果
上面已經(jīng)介紹了實(shí)現(xiàn)該程序的一個思路的,朋友是不是迫不及待的想看到到底自定義圖片查看器是什么樣子的呢?下面就通過一個動畫來讓大家更形象地看到程序的運(yùn)行效果的:

C#,圖片查看器

四、小結(jié)
到這里該文章的內(nèi)容就介紹結(jié)束了,希望大家如果遇到類似的問題可以很快從這篇文章中得到解決。



注:相關(guān)教程知識閱讀請移步到c#教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吉首市| 乐昌市| 且末县| 思茅市| 乐都县| 南皮县| 宜章县| 太白县| 客服| 泰安市| 行唐县| 盐源县| 汉中市| 淅川县| 九寨沟县| 鞍山市| 宁南县| 博乐市| 石渠县| 红河县| 鄂托克前旗| 鄂伦春自治旗| 兴文县| 台东市| 柘荣县| 宜州市| 龙里县| 龙州县| 渭源县| 武鸣县| 濮阳市| 德阳市| 修武县| 大连市| 乳山市| 射阳县| 阿克| 溆浦县| 天台县| 军事| 双峰县|