using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public class ImageHelper
{
/// <summary>
/// 獲取圖片中的各幀
/// </summary>
/// <param name="pPath">圖片路徑</param>
/// <param name="pSavePath">保存路徑</param>
public void GetFrames(string pPath, string pSavedPath)
{
Image gif = Image.FromFile(pPath);
FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]);
//獲取幀數(gif圖片可能包含多幀,其它格式圖片一般僅一幀)
int count = gif.GetFrameCount(fd);
//以Jpeg格式保存各幀
for (int i = 0; i < count; i++)
{
gif.SelectActiveFrame(fd, i);
gif.Save(pSavedPath + "//frame_" + i + ".jpg", ImageFormat.Jpeg);
}
}
/// <summary>
/// 獲取圖片縮略圖
/// </summary>
/// <param name="pPath">圖片路徑</param>
/// <param name="pSavePath">保存路徑</param>
/// <param name="pWidth">縮略圖寬度</param>
/// <param name="pHeight">縮略圖高度</param>
/// <param name="pFormat">保存格式,通常可以是jpeg</param>
public void GetSmaller(string pPath, string pSavedPath, int pWidth, int pHeight)
{
try
{
Image smallerImg;
Image originalImg = Image.FromFile(pPath);
Image.GetThumbnailImageAbort callback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
smallerImg = originalImg.GetThumbnailImage(pWidth, pHeight, callback, IntPtr.Zero);
smallerImg.Save(pSavedPath + "//smaller.jpg", ImageFormat.Jpeg);
}
catch (Exception x)
{
//
}
}
/// <summary>
/// 獲取圖片指定部分
/// </summary>
/// <param name="pPath">圖片路徑</param>
/// <param name="pSavePath">保存路徑</param>
/// <param name="pPartStartPointX">目標圖片開始繪制處的坐標X值(通常為)</param>
/// <param name="pPartStartPointY">目標圖片開始繪制處的坐標Y值(通常為)</param>
/// <param name="pPartWidth">目標圖片的寬度</param>
/// <param name="pPartHeight">目標圖片的高度</param>
/// <param name="pOrigStartPointX">原始圖片開始截取處的坐標X值</param>
/// <param name="pOrigStartPointY">原始圖片開始截取處的坐標Y值</param>
/// <param name="pFormat">保存格式,通常可以是jpeg</param>
public void GetPart(string pPath, string pSavedPath, int pPartStartPointX, int pPartStartPointY, int pPartWidth, int pPartHeight, int pOrigStartPointX, int pOrigStartPointY)
{
Image originalImg = Image.FromFile(pPath);
Bitmap partImg = new Bitmap(pPartWidth, pPartHeight);
Graphics graphics = Graphics.FromImage(partImg);
Rectangle destRect = new Rectangle(new Point(pPartStartPointX, pPartStartPointY), new Size(pPartWidth, pPartHeight));//目標位置
Rectangle origRect = new Rectangle(new Point(pOrigStartPointX, pOrigStartPointY), new Size(pPartWidth, pPartHeight));//原圖位置(默認從原圖中截取的圖片大小等于目標圖片的大小)
graphics.DrawImage(originalImg, destRect, origRect, GraphicsUnit.Pixel);
partImg.Save(pSavedPath + "//part.jpg", ImageFormat.Jpeg);
}
public bool ThumbnailCallback()
{
return false;
}
}
?//********************************************************************************************C#對圖片的幾種簡單處理
#region 生成縮略圖
??????? public void MakeSmallImg(string filePath, string saveImg)
??????? {
??????????? //從文件取得圖片對象
??????????? System.Drawing.Image image = System.Drawing.Image.FromFile(filePath, true);
???????????
??????????? //取得圖片大小
??????????? System.Drawing.Size size = new System.Drawing.Size((int)image.Width, (int)image.Height);
??????????? //新建一個bmp圖片
??????????? System.Drawing.Image bitmap = new System.Drawing.Bitmap(size.Width, size.Height);
??????????? //新建一個畫板
??????????? System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
??????????? //設置高質量插值法
??????????? g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default;
??????????? //設置高質量,低速度呈現平滑程度
??????????? g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
??????????? //清空一下畫布
??????????? g.Clear(System.Drawing.Color.White);
??????????? //在指定位置畫圖
??????????? g.DrawImage(image, new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
??????????????? new System.Drawing.Rectangle(0, 0, image.Width, image.Height),
??????????????? System.Drawing.GraphicsUnit.Pixel);
??????????? ///文字水印
??????????? //System.Drawing.Graphics G=System.Drawing.Graphics.FromImage(bitmap);
??????????? //System.Drawing.Font f=new Font("宋體",10);
??????????? //System.Drawing.Brush b=new SolidBrush(Color.Black);
??????????? //G.DrawString("myohmine",f,b,10,10);
??????????? //G.Dispose();
?
??????????? ///圖片水印
??????????? //System.Drawing.Image copyImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath("pic/1.gif"));
??????????? //Graphics a = Graphics.FromImage(bitmap);
??????????? //a.DrawImage(copyImage, new Rectangle(bitmap.Width-copyImage.Width,bitmap.Height-copyImage.Height,copyImage.Width, copyImage.Height),0,0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
??????????? //copyImage.Dispose();
??????????? //a.Dispose();
??????????? //copyImage.Dispose();
??????????? //保存高清晰度的縮略圖
??????????? //???bitmap.Save(strGoodFile, System.Drawing.Imaging.ImageFormat.Jpeg);
??????????? //???加個a表示是縮略圖
??????????? bitmap.Save(saveImg, System.Drawing.Imaging.ImageFormat.Jpeg);
??????????? g.Dispose();
??????????? image.Dispose();
??????????? bitmap.Dispose();
??????? }
??????? #endregion
//****************************************************************************************關于圖片處理方法(C#)
處理圖片時常用的過程是:讀入圖片文件并轉化為Bitmap -> 處理此Bitmap的每個點以得到需要的效果 -> 保存新的Bitmap到文件
使用C#很方便的就可以把多種格式的圖片文件讀到Bitmap對象中。一句話就夠了,常見的格式都支持,諸如JPEG,BMP,PNG等等。
Bitmap bmp = new Bitmap("文件名");
然后就是怎么處理這個圖片的問題了,與本案無關,pass。
最后就是保存。JPEG雖然是有損壓縮方案,但是它在縮減文件體積和盡可能好的保留原有信息的矛盾上很好的找到了平衡點,所以在很多情況下成為首選的保存方案。
C#當然不會無視這一點,Bitmap類提供了默認的另存為JPEG的方法:
bmp.Save("輸出文件", System.Drawing.Imaging.ImageFormat.Jpeg);
這樣當然很方便,但有時候更在乎文件體積而有時候更在乎圖像質量,是不是有什么辦法可以讓自己來控制壓縮質量呢?
答案是肯定的,bmp.Save方法中有個重載用到了EncoderParameters參數。我們可以在這個參數中加入自己的控制質量。