C#实现生成指定图片的缩略图

 更新时间:2024年04月20日 08:48:17   作者:初九之潜龙勿用  
这篇文章主要为大家详细介绍了如何使用C#实现生成指定图片的缩略图,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

应用场景

我们假设会有如下场景:

场景1:培训系统中,在上传课件培训视频素材的功能,我们会上传课程封面图片,将来会在课程详情内容中在指定的位置输出。

场景2:人才网站中,企业端管理后台,会上传企业的 LOGO 内容图片,用于企业介绍页面或岗位招聘详情页面等。

场景3:商城系统中,商品发布后台,会上传商品的主图宣传图片及其它关键介绍性图片,用于商品详情页面中进行展示、宣传。

以上等场景都会使用一个通用的功能,查询。查询的一个特征点,是会显示如上场景中涉及的课程封面图、企业LOGO图和商品主宣传图。通常为了提高查询性能显示效率,会在查询列表中显示原有图片的缩略图,因为为了达到显示效果,详情信息里的图片毕竟质量比较高、尺寸比较大。

因此,生成缩略图主要要达到以下目的:

1、缩略图通过压缩技术在尽量保证显示质量的情况下,能够在 Web 浏览器中更加迅速地载入数据。

2、较小的数据量可以节省流量成本。

3、制作存储新的缩略图(仅用于查询时显示)可以更加直观的吸引用户,提高系统体验感。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

方法设计

public  Byte[] MakeThumbnail 方法(制作缩略图)调用参数见如下表格:

序号参数类型说明
1originalImagePathstring物理路径图片文件地址,非唯一选项 
2bvalueByte[]Byte[] 类型数据,非唯一选项
3thumbnailPathstring非必选项,方法返回压缩后的 Byte[]数组数据,如果同时指定输出文件路径 thumbnailPath,则同时生成这个文
4width=0int指定输出缩略图的宽width,默认为0,表示为原图的宽
5height=0int指定输出缩略图的高height,默认为0,表示为原图的高
6modestringmode为压缩方法:"HW":指定高宽缩放(可能变形),"W":指定宽,高按比例 ,"H":指定高,宽按比例 , "Cut":指定高宽裁减(不变形),参数默认="Cut"
7interpolationModeSystem.Drawing.
Drawing2D.
InterpolationMode
指定在缩放或旋转图像时使用的算法,默认值=System.Drawing.Drawing2D.InterpolationMode.High

物理路径文件 originalImagePath 或 Byte[]型数据 bvalue,两者同时传递以物理路径文件优先。

实现代码

方法代码

//制作缩略图(压缩图),可接收两种参数,物理路径文件 originalImagePath 或 Byte[]型数据 bvalue,两者同时传递以物理路径文件优先。
//方法返回压缩后的 Byte[]数组数据,如果同时指定输出文件路径thumbnailPath,则同时生成这个文件。
//指定输出缩略图的宽width和高height,如果为0,则默认为原图的宽或高
//mode为压缩方法:"HW":指定高宽缩放(可能变形),"W":指定宽,高按比例 ,"H":指定高,宽按比例 , "Cut":指定高宽裁减(不变形)
 
public  Byte[] MakeThumbnail(string originalImagePath, Byte[] bvalue, string thumbnailPath, int width=0, int height=0, string mode="Cut", System.Drawing.Drawing2D.InterpolationMode interpolationMode= System.Drawing.Drawing2D.InterpolationMode.High)
{
                System.Drawing.Image originalImage;
                if (originalImagePath != "")
                {
                    originalImage = System.Drawing.Image.FromFile(originalImagePath);
                }
                else
                {
                    originalImage = System.Drawing.Image.FromStream(new System.IO.MemoryStream(bvalue));
                }
 
                int towidth = width;
                int toheight = height;
 
                int x = 0;
                int y = 0;
                int ow = originalImage.Width;
                int oh = originalImage.Height;
 
                if (towidth == 0)
                {
                    towidth = ow;
                }
                if (toheight == 0)
                {
                    toheight = oh;
                }
 
                switch (mode)
                {
                    case "HW"://指定高宽缩放(可能变形)                 
                        break;
                    case "W"://指定宽,高按比例                     
                        toheight = originalImage.Height * towidth / originalImage.Width;
                        break;
                    case "H"://指定高,宽按比例 
                        towidth = originalImage.Width * toheight / 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 * toheight / towidth;
                            x = 0;
                            y = (originalImage.Height - oh) / 2;
                        }
                        break;
                    default:
                        break;
                }
                //新建一个bmp图片 
                System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
 
                //新建一个画板 
                System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
 
                //设置高质量插值法 
                g.InterpolationMode = interpolationMode ;
 
                //设置高质量,低速度呈现平滑程度 
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
                //清空画布并以透明背景色填充 
                g.Clear(System.Drawing.Color.Transparent);
 
                //在指定位置并且按指定大小绘制原图片的指定部分 
                g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
                    new System.Drawing.Rectangle(x, y, ow, oh),
                    System.Drawing.GraphicsUnit.Pixel);
 
 
                try
                {
                    //以jpg格式保存缩略图 
                    System.IO.MemoryStream mstream = new System.IO.MemoryStream();
                    System.Drawing.Imaging.ImageFormat format = originalImage.RawFormat;
                    System.Drawing.Imaging.ImageFormat toFormat = System.Drawing.Imaging.ImageFormat.Jpeg;
                    if (format.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Jpeg;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Png))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Png;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Bmp))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Bmp;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Gif))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Gif;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Icon))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Icon;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Emf))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Emf;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Exif))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Exif;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Tiff))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Tiff;
                    }
                    else if (format.Equals(System.Drawing.Imaging.ImageFormat.Wmf))
                    {
                        toFormat = System.Drawing.Imaging.ImageFormat.Wmf;
                    }
 
                    bitmap.Save(mstream, toFormat);
                    
                    byte[] byData = new Byte[mstream.Length];
                    mstream.Position = 0;
                    mstream.Read(byData, 0, byData.Length);
                    mstream.Close();
                    if (thumbnailPath != "")
                    {
                        bitmap.Save(thumbnailPath, toFormat);
                    }
                    return byData;
                }
                catch (System.Exception e)
                {
                    throw e;
                }
                finally
                {
                    originalImage.Dispose();
                    bitmap.Dispose();
                    g.Dispose();
                }
}

调用示例

本调用示例实现判断上传的图像大小,如果图像大于2Mb则自动进行压缩处理。

string upfilename = Request.PhysicalApplicationPath + "\\upload.jpg"; //上传的图片路径
string mtfilename = Request.PhysicalApplicationPath + "\\mt.jpg";  //缩略图的图片路径
if (System.IO.File.Exists(upfilename))
{
    FileInfo fileInfo = new FileInfo(upfilename);
    float _fsize = fileInfo.Length / (1024*1024);
    if (_fsize >= 2)
    {
        MakeThumbnail(upfilename, null, mtfilename);
    }
    else
    {
        mtfilename = upfilename;
    }
    Response.Write("Result Filename is :"+mtfilename);
}

小结

输出缩略图可以采取动态输出和静态存储方式,动态输出耗性能,静态存储耗空间,我们可以以空间换时间来获取更高的性能。我们需要根据项目的实际情况来决定采用哪种方式比较平衡。

到此这篇关于C#实现生成指定图片的缩略图的文章就介绍到这了,更多相关C#生成图片缩略图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现快速将数据写入Excel单元格

    C#实现快速将数据写入Excel单元格

    这篇文章主要为大家详细介绍了如何使用C#实现快速将数据写入Excel单元格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • c#与js随机数生成方法

    c#与js随机数生成方法

    这篇文章主要介绍了c#与js随机数生成方法,实例分析了C#与js生成随机数的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • C#验证码的创建与使用示例

    C#验证码的创建与使用示例

    这篇文章主要介绍了C#验证码的创建与使用方法,结合实例形式较为详细的分析了C#验证码的创建、验证等操作步骤与相关技巧,需要的朋友可以参考下
    2017-01-01
  • C#队列Queue多线程用法实例

    C#队列Queue多线程用法实例

    这篇文章主要介绍了C#队列Queue多线程用法,实例分析了队列的相关使用技巧,需要的朋友可以参考下
    2015-05-05
  • C#使用SQL DataReader访问数据的优点和实例

    C#使用SQL DataReader访问数据的优点和实例

    今天小编就为大家分享一篇关于C#使用SQL DataReader访问数据的优点和实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C# Winform消息通知之系统本地通知local toast notification

    C# Winform消息通知之系统本地通知local toast notification

    这篇文章主要为大家介绍了C# Winform消息通知之系统本地通知local toast notification使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Unity3D实现甜品消消乐游戏

    Unity3D实现甜品消消乐游戏

    这篇文章主要介绍了通过C# Unity3D绘制一个甜品消消乐游戏,文中的示例代码讲解详细,对我们学习或工作有一定的帮助,感兴趣的小伙伴可以学习一下
    2021-12-12
  • C#操作INI文件的方法详解

    C#操作INI文件的方法详解

    INI文件全称是Initialization File的缩写,即初始化文件,是windows系统的系统配置文件所采用的存储格式,统管windows的各项配置。本文介绍了C#操作INI文件的方法,需要的可以参考一下
    2022-10-10
  • HashTable、HashSet和Dictionary的区别点总结

    HashTable、HashSet和Dictionary的区别点总结

    在本篇文章里小编给大家整理的是关于HashTable、HashSet和Dictionary的区别点,需要的朋友们可以学习下。
    2020-03-03
  • C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方法

    C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方法

    这篇文章主要介绍了C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方法,涉及C#窗体及鼠标事件响应的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论