欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-12 20:32:53
先看代码: 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 格式。