当前位置: 移动技术网 > IT编程>开发语言>.net > C# 生成高质量缩略图程序—终极算法

C# 生成高质量缩略图程序—终极算法

2018年04月25日  | 移动技术网IT编程  | 我要评论

兴业银行太原分行,中药材天地网,宋珠琼

先看代码:
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 格式。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网