Asp.net真正生成高质量不变形缩略图片

方法一:

C# 代码
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式</param>

public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
...{
Image originalImage
= Image.FromFile(originalImagePath);

int towidth = width;
int toheight = height;

int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;

switch (mode)
...{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width/originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height/originalImage.Height;
break;
case "Cut"://指定高宽裁减
if((double)originalImage.Width/(double)originalImage.Height > (double)towidth/(double)toheight)
...{
oh
= originalImage.Height;
ow
= originalImage.Height*towidth/toheight;
y
= 0;
x
= (originalImage.Width - ow)/2;
}

else
...{
ow
= originalImage.Width;
oh
= originalImage.Width*height/towidth;
x
= 0;
y
= (originalImage.Height - oh)/2;
}

break;
case "CutA"://指定高宽裁减(不变形)自定义
if(ow<=towidth&&oh<=toheight)
...{
x
=-(towidth-ow)/2;
y
=-(toheight-oh)/2;
ow
=towidth;
oh
=toheight;
}

else
...{
if(ow>oh)//宽大于高
...{
x
=0;
y
=-(ow-oh)/2;
oh
=ow;
}

else//高大于宽
...{
y
=0;
x
=-(oh-ow)/2;
ow
=oh;
}

}

break;
default :
break;
}


//新建一个bmp图片
Image bitmap = new System.Drawing.Bitmap(towidth,toheight);

//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);

//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以白色背景色填充
g.Clear(Color.White);

//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow,oh),
GraphicsUnit.Pixel);

try
...{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}

catch(System.Exception e)
...{
throw e;
}

finally
...{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}

}


方法二:

C# 代码
/// <summary>
///Class1 的摘要说明
/// </summary>

public class Class1
...{
public static void SendSmallImage(string fileName, string newFile, int maxHeight, int maxWidth)
...{
System.Drawing.Image img
= System.Drawing.Image.FromFile(fileName);
System.Drawing.Imaging.ImageFormat thisFormat
= img.RawFormat;

Size newSize
= NewSize(maxWidth, maxHeight, img.Width, img.Height);
Bitmap outBmp
= new Bitmap(newSize.Width, newSize.Height);
Graphics g
= Graphics.FromImage(outBmp);

// 设置画布的描绘质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode
= SmoothingMode.HighQuality;
g.InterpolationMode
= InterpolationMode.HighQualityBicubic;

g.DrawImage(img,
new Rectangle(0, 0, newSize.Width, newSize.Height),
0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
g.Dispose();

// 以下代码为保存图片时,设置压缩质量
EncoderParameters encoderParams = new EncoderParameters();
long[] quality = new long[1];
quality[
0] = 80;

EncoderParameter encoderParam
= new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[
0] = encoderParam;

//获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICI
= null;
for (int x = 0; x < arrayICI.Length; x++)
...{
string Format = arrayICI[x].FormatDe script _ ion;
if (arrayICI[x].FormatDe script _ ion.Equals("JPEG"))
...{
jpegICI
= arrayICI[x];//设置JPEG编码
break;
}

}


if (jpegICI != null)
...{
outBmp.Save(newFile, jpegICI, encoderParams);
}

else
...{
outBmp.Save(newFile, thisFormat);
}


img.Dispose();
outBmp.Dispose();
}


private static Size NewSize(int maxWidth, int maxHeight, int width, int height)
...{
double w = 0.0;
double h = 0.0;
double sw = Convert.ToDouble(width);
double sh = Convert.ToDouble(height);
double mw = Convert.ToDouble(maxWidth);
double mh = Convert.ToDouble(maxHeight);

if (sw < mw && sh < mh)
...{
w
= sw;
h
= sh;
}

else if ((sw / sh) > (mw / mh))
...{
w
= maxWidth;
h
= (w * sh) / sw;
}

else
...{
h
= maxHeight;
w
= (h * sw) / sh;
}


return new Size(Convert.ToInt32(w), Convert.ToInt32(h));
}



}
原文地址:https://www.cnblogs.com/leeolevis/p/1383132.html