///
/// 指定長寬裁剪
/// 按模版比例最大范圍的裁剪圖片并縮放至模版尺寸
///
///
/// 原圖Stream對象
/// 保存路徑
/// 最大寬(單位:px)
/// 最大高(單位:px)
/// 默認(rèn)不起用原始比例
public static void CutForCustom(string fromFile, string fileSaveUrl, int diy_width = QIYEIS_Config.thm_pic_width, int diy_height = QIYEIS_Config.thm_pic_height, bool _filerate = false)
{
int maxWidth = diy_width;
int maxHeight = diy_height;
//int quality = QIYEIS_Config.thm_pic_quality;
//從文件獲取原始圖片,并使用流中嵌入的顏色管理信息
System.Drawing.Image initImage = System.Drawing.Image.FromFile(fromFile);
////原圖寬高均小于模版,不作處理,直接保存
//if (initImage.Width <= maxWidth && initImage.Height <= maxHeight)
//{
// initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
//}
//else
//{
//原圖片的寬高比例
double initRate = (double)initImage.Width / initImage.Height;
//模版的寬高比例
double templateRate = (double)maxWidth / maxHeight;
//保持圖片原始比例,不足部分白色補(bǔ)齊
if (_filerate == true)
{
MakeThumbnail(fromFile, fileSaveUrl, diy_width, diy_height);
}
else
{
//原圖與模版比例相等,直接縮放
if (templateRate == initRate)
{
//按模版大小生成最終圖片
System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
templateG.Clear(Color.White);
templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
}
//原圖與模版比例不等,裁剪后縮放
else
{
//裁剪對象
System.Drawing.Image pickedImage = null;
System.Drawing.Graphics pickedG = null;
//定位
Rectangle fromR = new Rectangle(0, 0, 0, 0);//原圖裁剪定位
Rectangle toR = new Rectangle(0, 0, 0, 0);//目標(biāo)定位
//寬為標(biāo)準(zhǔn)進(jìn)行裁剪
if (templateRate > initRate)
{
//裁剪對象實例化
pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)System.Math.Floor(initImage.Width / templateRate));
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
//裁剪源定位
fromR.X = 0;
fromR.Y = (int)System.Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
fromR.Width = initImage.Width;
fromR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
//裁剪目標(biāo)定位
toR.X = 0;
toR.Y = 0;
toR.Width = initImage.Width;
toR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
}
//高為標(biāo)準(zhǔn)進(jìn)行裁剪
else
{
pickedImage = new System.Drawing.Bitmap((int)System.Math.Floor(initImage.Height * templateRate), initImage.Height);
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
fromR.X = (int)System.Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
fromR.Y = 0;
fromR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
fromR.Height = initImage.Height;
toR.X = 0;
toR.Y = 0;
toR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
toR.Height = initImage.Height;
}
//設(shè)置質(zhì)量
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//裁剪
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
//按模版大小生成最終圖片
System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
templateG.Clear(Color.White);
templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);
try
{
//以原有后綴保存圖片
ImageSave_Extension(fromFile, fileSaveUrl, templateImage);
}
catch (System.Exception e)
{
throw e;
}
finally
{
templateG.Dispose();
templateImage.Dispose();
pickedG.Dispose();
pickedImage.Dispose();
}
////關(guān)鍵質(zhì)量控制
////獲取系統(tǒng)編碼類型數(shù)組,包含了jpeg,bmp,png,gif,tiff
//ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
//ImageCodecInfo ici = null;
//foreach (ImageCodecInfo i in icis)
//{
// if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
// {
// ici = i;
// }
//}
//EncoderParameters ep = new EncoderParameters(1);
//ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
////保存縮略圖
//templateImage.Save(fileSaveUrl, ici, ep);
////templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
////釋放資源
//templateG.Dispose();
//templateImage.Dispose();
//pickedG.Dispose();
//pickedImage.Dispose();
}
//}
}
//釋放資源
initImage.Dispose();
}
網(wǎng)站無須三方授權(quán) · 安全穩(wěn)定、維護(hù)方便