其實在GDI+中,縮放和剪裁可以看作同一個操作,無非就是原始區域的選擇不同罷了。空口無憑,先看具體演算法可能更好理解。 /// Resize圖片////// 原始Bitmap
/// 新的寬度
/// 新的高度
/// 保留著,暫時未用
/// 處理以後的圖片
public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH, int Mode){try{Bitmap b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值演算法的質量
g.IntERPolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();return b;}catch{return null;}}// ===============================////// 剪裁 -- 用GDI+////// 原始Bitmap
/// 開始座標X
/// 開始座標Y/// 寬度/// 高度/// 剪裁後的Bitmap
public static Bitmap KiCut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight){if (b == null){return null;}int w = b.Width;
int h = b.Height;
if (StartX >= w || StartY >= h){return null;}if (StartX + iWidth > w){iWidth = w - StartX;}if (StartY + iHeight > h){iHeight = h - StartY;}try{Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bmpOut);
g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
return bmpOut;}catch{return null;}} 注意到區別了嗎?提示,g.DrawImage中第二個new Rectangle。 目標其實都是new Rectangle(0, 0, iWidth, iHeight),縮放演算法把整個原始圖都往目標區域裡塞new Rectangle(0, 0, bmp.Width, bmp.Height),而剪裁只是把原始區域上等寬等高的那個區域new Rectangle(StartX, StartY, iWidth, iHeight)1:1的塞到目標區域裡。
其實在GDI+中,縮放和剪裁可以看作同一個操作,無非就是原始區域的選擇不同罷了。空口無憑,先看具體演算法可能更好理解。 /// Resize圖片////// 原始Bitmap
/// 新的寬度
/// 新的高度
/// 保留著,暫時未用
/// 處理以後的圖片
public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH, int Mode){try{Bitmap b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值演算法的質量
g.IntERPolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();return b;}catch{return null;}}// ===============================////// 剪裁 -- 用GDI+////// 原始Bitmap
/// 開始座標X
/// 開始座標Y/// 寬度/// 高度/// 剪裁後的Bitmap
public static Bitmap KiCut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight){if (b == null){return null;}int w = b.Width;
int h = b.Height;
if (StartX >= w || StartY >= h){return null;}if (StartX + iWidth > w){iWidth = w - StartX;}if (StartY + iHeight > h){iHeight = h - StartY;}try{Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bmpOut);
g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
return bmpOut;}catch{return null;}} 注意到區別了嗎?提示,g.DrawImage中第二個new Rectangle。 目標其實都是new Rectangle(0, 0, iWidth, iHeight),縮放演算法把整個原始圖都往目標區域裡塞new Rectangle(0, 0, bmp.Width, bmp.Height),而剪裁只是把原始區域上等寬等高的那個區域new Rectangle(StartX, StartY, iWidth, iHeight)1:1的塞到目標區域裡。