C# 生成高质量缩略图程序—终极算法
程序员文章站
2023-11-10 15:05:40
先看代码: using system; using system.drawing; using system.drawing.imaging;...
先看代码:
using system;
using system.drawing;
using system.drawing.imaging;
using system.drawing.drawing2d;
/**//// <summary>
///
/// **生成高质量缩略图程序**
///
/// file: generatethumbnail.cs
///
/// author: 周振兴 (zxjay 飘遥)
///
/// e-mail: tda7264@163.com
///
/// date: 07-04-07
///
/// </summary>
public class generatethumbnail
...{
/**//// <summary>
/// 生成缩略图 静态方法
/// </summary>
/// <param name="pathimagefrom"> 源图的路径(含文件名及扩展名) </param>
/// <param name="pathimageto"> 生成的缩略图所保存的路径(含文件名及扩展名)
/// 注意:扩展名一定要与生成的缩略图格式相对应 </param>
/// <param name="width"> 欲生成的缩略图 "画布" 的宽度(像素值) </param>
/// <param name="height"> 欲生成的缩略图 "画布" 的高度(像素值) </param>
public static void genthumbnail(string pathimagefrom,string pathimageto,int width,int height)
...{
image imagefrom = null;
try
...{
imagefrom = image.fromfile(pathimagefrom);
}
catch
...{
//throw;
}
if (imagefrom == null)
...{
return;
}
// 源图宽度及高度
int imagefromwidth = imagefrom.width;
int imagefromheight = imagefrom.height;
// 生成的缩略图实际宽度及高度
int bitmapwidth = width;
int bitmapheight = height;
// 生成的缩略图在上述"画布"上的位置
int x = 0;
int y = 0;
// 根据源图及欲生成的缩略图尺寸,计算缩略图的实际尺寸及其在"画布"上的位置
if (bitmapheight * imagefromwidth > bitmapwidth * imagefromheight)
...{
bitmapheight = imagefromheight * width / imagefromwidth;
y = (height - bitmapheight) / 2;
}
else
...{
bitmapwidth = imagefromwidth * height / imagefromheight;
x = (width - bitmapwidth) / 2;
}
// 创建画布
bitmap bmp = new bitmap(width, height);
graphics g = graphics.fromimage(bmp);
// 用白色清空
g.clear(color.white);
// 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
g.interpolationmode = interpolationmode.highqualitybicubic;
// 指定高质量、低速度呈现。
g.smoothingmode = smoothingmode.highquality;
// 在指定位置并且按指定大小绘制指定的 image 的指定部分。
g.drawimage(imagefrom, new rectangle(x, y, bitmapwidth, bitmapheight), new rectangle(0, 0, imagefromwidth, imagefromheight), graphicsunit.pixel);
try
...{
//经测试 .jpg 格式缩略图大小与质量等最优
bmp.save(pathimageto, imageformat.jpeg);
}
catch
...{
}
finally
...{
//显示释放资源
imagefrom.dispose();
bmp.dispose();
g.dispose();
}
}
}
生成的缩略图大小一定,无剪裁、无变形。
可以测试一下各种图形格式、图形质量、呈现方式生成的缩略图的大小和视觉质量。
经测试:vista 原默认桌面 .jpg 格式 尺寸:1024*768,
生成原尺寸大小的缩略图,比较如下:
原图.jpg格式,223 kb
.jpg 102kb
.png 1816 kb
.gif 228 kb
.tiff 2000kb 以上
…
视觉上 除 .gif 质量较差外,其他的与源图肉眼无法区别(本人有点近视^-^)
在考虑到专利及通用性等因素,推荐用 .jpg 格式。
using system;
using system.drawing;
using system.drawing.imaging;
using system.drawing.drawing2d;
/**//// <summary>
///
/// **生成高质量缩略图程序**
///
/// file: generatethumbnail.cs
///
/// author: 周振兴 (zxjay 飘遥)
///
/// e-mail: tda7264@163.com
///
/// date: 07-04-07
///
/// </summary>
public class generatethumbnail
...{
/**//// <summary>
/// 生成缩略图 静态方法
/// </summary>
/// <param name="pathimagefrom"> 源图的路径(含文件名及扩展名) </param>
/// <param name="pathimageto"> 生成的缩略图所保存的路径(含文件名及扩展名)
/// 注意:扩展名一定要与生成的缩略图格式相对应 </param>
/// <param name="width"> 欲生成的缩略图 "画布" 的宽度(像素值) </param>
/// <param name="height"> 欲生成的缩略图 "画布" 的高度(像素值) </param>
public static void genthumbnail(string pathimagefrom,string pathimageto,int width,int height)
...{
image imagefrom = null;
try
...{
imagefrom = image.fromfile(pathimagefrom);
}
catch
...{
//throw;
}
if (imagefrom == null)
...{
return;
}
// 源图宽度及高度
int imagefromwidth = imagefrom.width;
int imagefromheight = imagefrom.height;
// 生成的缩略图实际宽度及高度
int bitmapwidth = width;
int bitmapheight = height;
// 生成的缩略图在上述"画布"上的位置
int x = 0;
int y = 0;
// 根据源图及欲生成的缩略图尺寸,计算缩略图的实际尺寸及其在"画布"上的位置
if (bitmapheight * imagefromwidth > bitmapwidth * imagefromheight)
...{
bitmapheight = imagefromheight * width / imagefromwidth;
y = (height - bitmapheight) / 2;
}
else
...{
bitmapwidth = imagefromwidth * height / imagefromheight;
x = (width - bitmapwidth) / 2;
}
// 创建画布
bitmap bmp = new bitmap(width, height);
graphics g = graphics.fromimage(bmp);
// 用白色清空
g.clear(color.white);
// 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
g.interpolationmode = interpolationmode.highqualitybicubic;
// 指定高质量、低速度呈现。
g.smoothingmode = smoothingmode.highquality;
// 在指定位置并且按指定大小绘制指定的 image 的指定部分。
g.drawimage(imagefrom, new rectangle(x, y, bitmapwidth, bitmapheight), new rectangle(0, 0, imagefromwidth, imagefromheight), graphicsunit.pixel);
try
...{
//经测试 .jpg 格式缩略图大小与质量等最优
bmp.save(pathimageto, imageformat.jpeg);
}
catch
...{
}
finally
...{
//显示释放资源
imagefrom.dispose();
bmp.dispose();
g.dispose();
}
}
}
生成的缩略图大小一定,无剪裁、无变形。
可以测试一下各种图形格式、图形质量、呈现方式生成的缩略图的大小和视觉质量。
经测试:vista 原默认桌面 .jpg 格式 尺寸:1024*768,
生成原尺寸大小的缩略图,比较如下:
原图.jpg格式,223 kb
.jpg 102kb
.png 1816 kb
.gif 228 kb
.tiff 2000kb 以上
…
视觉上 除 .gif 质量较差外,其他的与源图肉眼无法区别(本人有点近视^-^)
在考虑到专利及通用性等因素,推荐用 .jpg 格式。
下一篇: C# 生成高质量缩略图程序—终极算法