首页 > 编程语言 >C# 图片处理生成缩略图

C# 图片处理生成缩略图

时间:2022-11-14 14:13:03浏览次数:68  
标签:OriginalImage img 缩略图 C# System 生成 Width Height

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
    }
C# 复制 全屏
  • 在该方法中我们首先使用(Bitmap)System.Drawing.Image.FromFile将文件加载到bitmap。
  • 根据mode传入的压缩模式进行原始绘图区域的计算。
  • 将计算出的区域绘制到新的BitMap。
  • 将绘制的BitMap图片保存到指定文件。

通过如上的几步就完成了缩略图的生成。

作者:SunSpring

出处:https://www.cnblogs.com/SunSpring/p/16308820.html

本文版权归作者所有,欢迎转载,但未经作者同意需在文章页面明显位置给出原文链接。

标签:OriginalImage,img,缩略图,C#,System,生成,Width,Height
From: https://www.cnblogs.com/sexintercourse/p/16888864.html

相关文章

  • 真趣科技:多业务形态的企业需要灵活可配置的CRM系统
    苏州真趣信息科技有限公司,物联网领域国家高新技术企业。位置物联网领域博士后、博士领衔科研团队,荣获300余项专利、重磅荣誉、国际国内权威机构认证。公司旗下拥有“真趣......
  • C# iText 7 切分PDF,处理PDF页面大小,添加水印
    C#iText7切分PDF,处理PDF页面大小,添加水印 一、itext我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf.iText的官网有关于它的介绍,http......
  • Failed to check the status of the service XXX.XXX. No provider available for the
    TheDubboConsumerCANNOTFIND service 1.检查消费者端配置version是否和提供者一致,有时候你消费者配置version="*"也是不行的2.检查group分组,如果有分组,则检查消......
  • Canal安装配置(消息队列类型:RabbitMQ)
    1.Mysql配置canal支持源端MySQL版本包括5.1.x,5.5.x,5.6.x,5.7.x,8.0.x1.1.查看mysqlbinlog是否开启:SHOWVARIABLESLIKE'log_bin' ON标识开启,如果m......
  • Oracle19c下载、安装及卸载
    1、官网下载地址:DatabaseSoftwareDownloads|Oracle  *安装zip文件,see all文件是对应客户端的下载位置(用于自学无需下载) 2、登陆Oracle账号,若无Oracle......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site
    比赛链接:https://codeforces.com/gym/104023A.Dunai题意:\(n\)个队伍获得过冠军,告知每个队伍中的人及对应的位置,现在已知\(m\)个选手及它们的位置,问能组成多少个五......
  • C和C++的区别
    一、面向过程语言和面向对象语言C语言是面向过程语言,而C++是面向对象语言(一)面向过程和面向对象的区别(1)面向过程:面向过程编程就是分析出解决问题的步骤,然后把这些步骤一......
  • ASP.NET Core中选项的应用和总结
    在前面的文章中,我们介绍过将appsetting等配置文件映射到实体的的方式https://www.cnblogs.com/fei686868/p/16779249.html这里呢,我们介绍关于选项的另一种用法,就是通过IOp......
  • javascript对象和内置对象
    了解对象对象是什么?对象是一组无序的相关属性和方法集合,js中所有事物都是对象,例如字符串,数值,数组,函数等对象是由属性和方法组成的属性:事物的特征,在对象中用属性来表示(常......
  • C#写日志两个简单方法
    https://blog.csdn.net/hdhai9451/article/details/46455813https://www.cnblogs.com/wyt007/p/8023391.html在开发,有时为了验证程序运行是否正确,通常要写日志来记录操作......