C#如何实现图片查看器

2019-12-30 12:06:55于丽
这篇文章主要为大家详细介绍了C#如何实现图片查看器的相关方法,C#实现一个像Windows自带的图片查看器的功能,感兴趣的小伙伴们可以参考一下  

这篇文章将简单介绍下如何使用C#来实现一个图片查看器的功能的,该工具保存的功能有:

1、 可以通过“上一张” “下一张”这样的按钮来轮换浏览图片
 2、实现对图片的旋转
 3、实现对旋转后图片的保存功能。本程序不仅提供旋转90/180/270这样的实现,同时提供一个方法来完成旋转任意角度的实现
4、该程序未实现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);
   }
  }