C#實(shí)現(xiàn)對(duì)圖片文件的壓縮、裁剪操作實(shí)例
本文實(shí)例講述了C#對(duì)圖片文件的壓縮、裁剪操作方法,在C#項(xiàng)目開發(fā)中非常有實(shí)用價(jià)值。分享給大家供大家參考。具體如下:
一般在做項(xiàng)目時(shí),對(duì)圖片的處理,以前都采用在上傳時(shí),限制其大小的方式,這樣帶來諸多不便。畢竟網(wǎng)站運(yùn)維人員不一定會(huì)對(duì)圖片做處理,經(jīng)常超出大小限制,即使會(huì)使用圖片處理軟件的,也由于個(gè)人水平方面原因,處理效果差強(qiáng)人意。
于是采用C#為我們提供的圖像編輯功能,實(shí)現(xiàn)一站式上傳,通過程序生成所需大小、尺寸的目標(biāo)圖片。
具體步驟如下:
先說圖片壓縮:
第一步:需要讀取一個(gè)圖片文件,讀取方法:
// <param name="ImageFilePathAndName">圖片文件的全路徑名稱</param> public Image ResourceImage =Image.FromFile(ImageFilePathAndName);
說明:
Image類:引用自System.Drawing,為源自 Bitmap 和 Metafile 的類提供功能的抽象基類。
主要屬性:Size->獲取此圖像的以像素為單位的寬度和高度。
PhysicalDimension->獲取此圖像的寬度和高度(如果該圖像是位圖,以像素為單位返回寬度和高度。如果該圖像是圖元文件,則以0.01 毫米為單位返回寬度和高度。)。
PixelFormat->獲取此 Image 的像素格式。
Height、Width->獲取此 Image 的高度、寬度(以像素為單位)。
主要方法:FromFile(String)->從指定的文件創(chuàng)建 Image。
FromStream(Stream)->從指定的數(shù)據(jù)流創(chuàng)建 Image。
Save(String fileName)->將該 Image 保存到指定的文件或流。
Save(Stream, ImageFormat)->將此圖像以指定的格式保存到指定的流中。
Save(String, ImageFormat)->將此 Image 以指定格式保存到指定文件。
更多屬性和方法說明請(qǐng)點(diǎn)擊。
第二步,生成縮略圖,并且將原圖內(nèi)容按指定大小繪制到目標(biāo)圖片。
/// <summary>
/// 生成縮略圖重載方法1,返回縮略圖的Image對(duì)象
/// </summary>
/// <param name="Width">縮略圖的寬度</param>
/// <param name="Height">縮略圖的高度</param>
/// <returns>縮略圖的Image對(duì)象</returns>
public Image GetReducedImage(int Width, int Height)
{
try
{
//用指定的大小和格式初始化Bitmap類的新實(shí)例
Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
//從指定的Image對(duì)象創(chuàng)建新Graphics對(duì)象
Graphics graphics = Graphics.FromImage(bitmap);
//清除整個(gè)繪圖面并以透明背景色填充
graphics.Clear(Color.Transparent);
//在指定位置并且按指定大小繪制原圖片對(duì)象
graphics.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height));
return bitmap;
}
catch (Exception e)
{
ErrMessage = e.Message;
return null;
}
}
說明:
1、Bitmap類
引用自System.Drawing,封裝 GDI+ 位圖,此位圖由圖形圖像及其特性的像素?cái)?shù)據(jù)組成。Bitmap 是用于處理由像素?cái)?shù)據(jù)定義的圖像的對(duì)象。
關(guān)于封裝圖像的對(duì)象,詳細(xì)介紹可參看官方文檔:http://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap.aspx。
2、Graphics類
引用自System.Drawing,(處理圖像的對(duì)象),封裝一個(gè) GDI+ 繪圖圖面。
關(guān)于Graphics類可點(diǎn)此查看官方教程:http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics.aspx。
第三步,保存
第二步操作中返回的Image對(duì)象,暫時(shí)命名為:iImage:
iImage.Save(pathAndName, System.Drawing.Imaging.ImageFormat.Jpeg);
以上是壓縮操作,做了下試驗(yàn),101k的圖片,經(jīng)過壓縮后是57k。這個(gè)應(yīng)該和尺寸有關(guān)系。
以下是圖片裁剪,其實(shí)原理和上面相似,無非也就是對(duì)圖片進(jìn)行重畫操作。
/// <summary>
/// 截取圖片方法
/// </summary>
/// <param name="url">圖片地址</param>
/// <param name="beginX">開始位置-X</param>
/// <param name="beginY">開始位置-Y</param>
/// <param name="getX">截取寬度</param>
/// <param name="getY">截取長(zhǎng)度</param>
/// <param name="fileName">文件名稱</param>
/// <param name="savePath">保存路徑</param>
/// <param name="fileExt">后綴名</param>
public static string CutImage(string url, int beginX, int beginY, int getX, int getY, string fileName, string savePath, string fileExt)
{
if ((beginX < getX) && (beginY < getY))
{
Bitmap bitmap = new Bitmap(url);//原圖
if (((beginX + getX) <= bitmap.Width) && ((beginY + getY) <= bitmap.Height))
{
Bitmap destBitmap = new Bitmap(getX, getY);//目標(biāo)圖
Rectangle destRect = new Rectangle(0, 0, getX, getY);//矩形容器
Rectangle srcRect = new Rectangle(beginX, beginY, getX, getY);
Graphics.FromImage(destBitmap);
Graphics.DrawImage(bitmap, destRect, srcRect, GraphicsUnit.Pixel);
ImageFormat format = ImageFormat.Png;
switch (fileExt.ToLower())
{
case "png":
format = ImageFormat.Png;
break;
case "bmp":
format = ImageFormat.Bmp;
break;
case "gif":
format = ImageFormat.Gif;
break;
}
destBitmap.Save(savePath + "http://" + fileName , format);
return savePath + "\\" + "*" + fileName.Split('.')[0] + "." + fileExt;
}
else
{
return "截取范圍超出圖片范圍";
}
}
else
{
return "請(qǐng)確認(rèn)(beginX < getX)&&(beginY < getY)";
}
}
說明:
Rectangle類:矩形,詳情可參考官方文檔:http://msdn.microsoft.com/zh-cn/library/system.windows.shapes.rectangle(v=vs.85).aspx
以上就是裁剪一個(gè)圖片文件的示例代碼。
本文所使用代碼,是項(xiàng)目中真實(shí)代碼,已經(jīng)過測(cè)試。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#實(shí)現(xiàn)Dev Grid拖拽移動(dòng)行的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Dev Grid拖拽移動(dòng)行的方法,可實(shí)現(xiàn)Dev Grid拖拽移動(dòng)行的效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
將Qt項(xiàng)目升級(jí)到Qt6吐血經(jīng)驗(yàn)總結(jié)
很多朋友向小編反饋將Qt項(xiàng)目升級(jí)到Qt6頻繁出錯(cuò),該如何處理呢,今天小編給大家?guī)砹藢t項(xiàng)目升級(jí)到Qt6吐血經(jīng)驗(yàn)總結(jié),感興趣的朋友一起看看吧2021-07-07
Unity3D控件Easytouch控制主角移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Unity3D控件Easytouch控制主角移動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Unity實(shí)現(xiàn)汽車前后輪倒車軌跡計(jì)算
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)汽車前后輪倒車軌跡計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
C#爬蟲基礎(chǔ)之HttpClient獲取HTTP請(qǐng)求與響應(yīng)
這篇文章介紹了C#使用HttpClient獲取HTTP請(qǐng)求與響應(yīng)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

