這篇文章將簡單介紹下如何使用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);
}
}
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
;
}
}