C#图片处理如何生成缩略图的实现

 更新时间:2023年02月07日 10:35:15   作者:忧郁的蛋~  
本文主要介绍了C#图片处理如何生成缩略图的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

缩略图通常是将图片内容进行一定的缩小展现,或裁剪展现,主要有两个目的,一是提供一定的预览功能,二是节省屏幕展示空间、节省流量。
在网站中我们通常运用在商品的列表,比如商城、图书、新闻等等列表的图片。在C#中我们如何生成缩略图呢,也就是缩小图片,下面我们来看一看如何缩小图片。

其中方法参数如下:

  • originalImagePath:源图路径(物理路径)
  • thumbnailPath:缩略图路径(物理路径)
  • width:生成缩略图宽度
  • height:生成缩略图高度
  • mode:生成缩略图的模式

代码如下

 
        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, ThumbnailMode mode)
        {
            System.Drawing.Image img_OriginalImage = null;
            ImageFormat tFormat = null;
            try
            {
                img_OriginalImage = (Bitmap)System.Drawing.Image.FromFile(originalImagePath);
                tFormat = img_OriginalImage.RawFormat;
            }
            catch (Exception ex)
            {
                if (img_OriginalImage != null)
                {
                    img_OriginalImage.Dispose();
                }
               
                throw new Exception("压缩图片:" + originalImagePath + "失败!\r\n" + ex.Message);
 
            }
 
            int i_ToWidth = width;
            int i_ToHeight = height;
 
            int x = 0;
            int y = 0;
 
            int i_OriginalWidth = img_OriginalImage.Width;
            int i_OriginalHeight = img_OriginalImage.Height;
 
            switch (mode)
            {
                case ThumbnailMode.Width:
                    i_ToHeight = img_OriginalImage.Height * width / img_OriginalImage.Width;
                    break;
                case ThumbnailMode.Height:
                    i_ToWidth = img_OriginalImage.Width * height / img_OriginalImage.Height;
                    break;
                case ThumbnailMode.Cut:
                    if ((double)img_OriginalImage.Width / (double)img_OriginalImage.Height > (double)i_ToWidth / (double)i_ToHeight)
                    {
                        i_OriginalHeight = img_OriginalImage.Height;
                        i_OriginalWidth = img_OriginalImage.Height * i_ToWidth / i_ToHeight;
                        y = 0;
                        x = (img_OriginalImage.Width - i_OriginalWidth) / 2;
                    }
                    else
                    {
                        i_OriginalWidth = img_OriginalImage.Width;
                        i_OriginalHeight = img_OriginalImage.Width * height / i_ToWidth;
                        x = 0;
                        y = (img_OriginalImage.Height - i_OriginalHeight) / 2;
                    }
                    break;
                default:
                    break;
            }
 
            //新建一个BMP图片
            System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight);
            //新建一个画板
            System.Drawing.Graphics gp = Graphics.FromImage(img_BitMap);
            //设置高质量插值法
            gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            //设置高质量、低速度呈现平滑程度
            gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gp.CompositingQuality = CompositingQuality.HighQuality;
 
            //清空画布并以透明背景色填充
            gp.Clear(Color.Transparent);
            //指定位置并按大小绘制原图片的指定部分
            gp.DrawImage(img_OriginalImage, new Rectangle(0, 0, i_ToWidth, i_ToHeight), new Rectangle(x, y, i_OriginalWidth, i_OriginalHeight), GraphicsUnit.Pixel);
 
            try
            {
                EncoderParameters ep = new EncoderParameters();
                long[] qy = new long[1];
                qy[0] = 100;//设置压缩的比例1-100  
                EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
                ep.Param[0] = eParam;
 
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegICIinfo = null;
                for (int i = 0; i < arrayICI.Length; i++)
                {
                    if (arrayICI[i].FormatDescription.Equals("JPEG"))
                    {
                        jpegICIinfo = arrayICI[i];
                        break;
                    }
                }
                if (jpegICIinfo != null && Equals(tFormat, ImageFormat.Jpeg))
                {
                    //以JPG格式保存图片
                    img_BitMap.Save(thumbnailPath, jpegICIinfo, ep);
                    //Const.iSuccessCount++;
                }
                else
                {
                    img_BitMap.Save(thumbnailPath, tFormat);
                    //Const.iSuccessCount++;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("复制图片:" + originalImagePath + "失败!\r\n" + ex.Message + ex.StackTrace);
            }
            finally
            {
                if (img_OriginalImage != null)
                {
                    img_OriginalImage.Dispose();
                }
                if (img_BitMap != null)
                {
                    img_BitMap.Dispose();
                }
                if (gp != null)
                {
                    gp.Dispose();
                }
                //GC.Collect();
            }
        }
public enum ThumbnailMode
    {
        /// <summary>
        /// 指定宽度,高度按照比例缩放
        /// </summary>
        Width = 0,
 
        /// <summary>
        /// 指定高度,宽度按照比例缩放
        /// </summary>
        Height = 1,
 
        /// <summary>
        /// 按照指定的高度和宽度剪裁
        /// </summary>
        Cut = 2,
 
        /// <summary>
        /// 指定宽度,高度按照比例缩放
        /// </summary>
        None = 3
    }

在该方法中我们首先使用(Bitmap)System.Drawing.Image.FromFile将文件加载到bitmap。
根据mode传入的压缩模式进行原始绘图区域的计算。
将计算出的区域绘制到新的BitMap。
将绘制的BitMap图片保存到指定文件。
通过如上的几步就完成了缩略图的生成。

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

相关文章

  • .Net WInform开发笔记(五)关于事件Event

    .Net WInform开发笔记(五)关于事件Event

    我前面几篇博客中提到过.net中的事件与Windows事件的区别,本文讨论的是前者,也就是我们代码中经常用到的Event,感兴趣的朋友可以了解下
    2013-01-01
  • C#判断语句的表达式树实现

    C#判断语句的表达式树实现

    这篇文章介绍了C#判断语句的表达式树实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • c#如何利用定时器自动备份数据库详解

    c#如何利用定时器自动备份数据库详解

    在开发过程当中,你一定遇到文件损坏活或丢失的烦恼,而每天备份又很麻烦,你只要设置每天备份的时间,并将程序加入启动项中,就可以自动完成备份,这篇文章主要给大家介绍了关于c#如何利用定时器自动备份数据库的相关资料,需要的朋友可以参考下
    2021-10-10
  • C# 解压gizp文件(.tgz)的实例

    C# 解压gizp文件(.tgz)的实例

    下面小编就为大家分享一篇C# 解压gizp文件(.tgz)的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • FileShare枚举的使用小结(文件读写锁)

    FileShare枚举的使用小结(文件读写锁)

    其实/FileShare就是控制文件流的“访问权限”,当然,这仅仅是入门的文件操作,自己做了笔记,也希望能给大家带来帮助
    2014-01-01
  • C#基于JsonConvert解析Json数据的方法实例

    C#基于JsonConvert解析Json数据的方法实例

    最近初接触C#语言,发现JSON解析这块和JAVA差异过大,下面这篇文章主要给大家介绍了关于C#基于JsonConvert解析Json数据的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • VMS中解协议常用方法备忘(小结)

    VMS中解协议常用方法备忘(小结)

    这篇文章主要介绍了VMS中解协议常用方法备忘(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • C# 实现基于ADO.NET框架的DBHelper工具类(简化数据库操作)

    C# 实现基于ADO.NET框架的DBHelper工具类(简化数据库操作)

    ADO.NET是.NET框架中用于与数据库交互的核心组件,提供了一套用于连接数据库、执行SQL查询、插入、更新和删除数据的类库,包括SqlConnection、SqlCommand、SqlDataReader等,本文介绍如何使用DBHelper类封装数据库操作,以提高代码的可维护性和复用性,感兴趣的朋友一起看看吧
    2024-08-08
  • Winform 控件优化LayeredWindow无锯齿圆角窗体

    Winform 控件优化LayeredWindow无锯齿圆角窗体

    这篇文章主要为大家介绍了Winform 控件优化LayeredWindow实现无锯齿圆角窗体示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C#+无unsafe的非托管大数组示例详解(large unmanaged array in c# without ‘unsafe’ keyword)

    C#+无unsafe的非托管大数组示例详解(large unmanaged array in c# without ‘u

    这篇文章主要给大家介绍了关于C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论