zoukankan      html  css  js  c++  java
  • 【转载】C#生成图片的缩略图

    图片处理是C#程序开发中时常会涉及到的一个业务,除了图像的上传、保存以及下载等功能外,根据上传的图片生成一个缩略图也是常见业务,在C#语言中,可以通过Image类提供的相关方法对图片进行操作,如指定宽高对图片进行缩放, 指定高宽裁减裁剪图片、生成图片水印等。

    定义一个图片处理工具类PicDeal,该类实现了生成缩略图、在图片上生成图片水印等相应功能。具体的业务代码如下:

        /// <summary>
        /// 枚举,生成缩略图模式
        /// </summary>
        public enum ThumbnailMod : byte
        {
            /// <summary>
            /// HW
            /// </summary>
            HW,
            /// <summary>
            /// W
            /// </summary>
            W,
            /// <summary>
            /// H
            /// </summary>
            H,
            /// <summary>
            /// Cut
            /// </summary>
            Cut
        };
        /// <summary>
        /// 操作图片类, 生成缩略图,添加水印
        /// </summary>
        public static class PicDeal
        {
            private static Hashtable htmimes = new Hashtable();
            internal static readonly string AllowExt = ".jpe|.jpeg|.jpg|.png|.tif|.tiff|.bmp";
            #region 生成缩略图
            /// <summary>
            /// 生成缩略图
            /// </summary>
            /// <param name="originalImagePath"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            /// <param name="mode"></param>
            /// <returns></returns>
            public static bool MakeThumbnail(string originalImagePath, int width, int height, ThumbnailMod mode)
            {
                string thumbnailPath = originalImagePath.Substring(0, originalImagePath.LastIndexOf('.')) + "s.jpg";
                Image originalImage = Image.FromFile(originalImagePath);
                int towidth = width;
                int toheight = height;
                int x = 0;
                int y = 0;
                int ow = originalImage.Width;
                int oh = originalImage.Height;
                switch (mode)
                {
                    case ThumbnailMod.HW://指定高宽缩放(可能变形)                
                        break;
                    case ThumbnailMod.W://指定宽,高按比例                    
                        toheight = originalImage.Height * width / originalImage.Width;
                        break;
                    case ThumbnailMod.H://指定高,宽按比例
                        towidth = originalImage.Width * height / originalImage.Height;
                        break;
                    case ThumbnailMod.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 * height / towidth;
                            x = 0;
                            y = (originalImage.Height - oh) / 2;
                        }
                        break;
                    default:
                        break;
                }
                //新建一个bmp图片
                Image bitmap = new Bitmap(towidth, toheight);
                //新建一个画板
                Graphics g = Graphics.FromImage(bitmap);
                //设置高质量插值法
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                //设置高质量,低速度呈现平滑程度
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //清空画布并以透明背景色填充
                g.Clear(System.Drawing.Color.Transparent);
                //在指定位置并且按指定大小绘制原图片的指定部分
                g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
                    new Rectangle(x, y, ow, oh),
                    GraphicsUnit.Pixel);
                bool isok = false;
                try
                {
                    //以jpg格式保存缩略图
                    bitmap.Save(thumbnailPath, ImageFormat.Jpeg);
                    isok = true;
                }
                catch (Exception)
                {
                    thumbnailPath = originalImagePath;
                }
                finally
                {
                    originalImage.Dispose();
                    bitmap.Dispose();
                    g.Dispose();
                }
                return isok;
            }
            #endregion
            #region 在图片上生成图片水印
            ///// <summary>
            ///// 在图片上生成图片水印
            ///// </summary>
            ///// <param name="Path">原服务器图片路径</param>
            ///// <param name="Path_syp">生成的带图片水印的图片路径</param>
            ///// <param name="Path_sypf">水印图片路径</param>
            /// <summary>
            /// 在图片上生成图片水印
            /// </summary>
            /// <param name="Path">原服务器图片路径</param>
            /// <param name="Path_sypf">水印图片路径</param>
            public static void AddWaterPic(string Path, string Path_sypf)
            {
                try
                {
                    Image image = Image.FromFile(Path);
                    Image copyImage = Image.FromFile(Path_sypf);
                    Graphics g = Graphics.FromImage(image);
                    g.DrawImage(copyImage, new System.Drawing.Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel);
                    g.Dispose();
                    image.Save(Path + ".temp");
                    image.Dispose();
                    System.IO.File.Delete(Path);
                    File.Move(Path + ".temp", Path);
                }
                catch
                { }
            }
            #endregion
            /// <summary>
            /// 公共方法
            /// </summary>
            private static void GetImgType()
            {
                htmimes[".jpe"] = "image/jpeg";
                htmimes[".jpeg"] = "image/jpeg";
                htmimes[".jpg"] = "image/jpeg";
                htmimes[".png"] = "image/png";
                htmimes[".tif"] = "image/tiff";
                htmimes[".tiff"] = "image/tiff";
                htmimes[".bmp"] = "image/bmp";
            }
    
            #region 返回新图片尺寸
            /// <summary>
            /// 返回新图片尺寸
            /// </summary>
            /// <param name="width">原始宽</param>
            /// <param name="height">原始高</param>
            /// <param name="maxWidth">新图片最大宽</param>
            /// <param name="maxHeight">新图片最大高</param>
            /// <returns></returns>
            public static Size ResizeImage(int width, int height, int maxWidth, int maxHeight)
            {
                decimal MAX_WIDTH = (decimal)maxWidth;
                decimal MAX_HEIGHT = (decimal)maxHeight;
                decimal ASPECT_RATIO = MAX_WIDTH / MAX_HEIGHT;
                int newWidth, newHeight;
                decimal originalWidth = (decimal)width;
                decimal originalHeight = (decimal)height;
                if (originalWidth > MAX_WIDTH || originalHeight > MAX_HEIGHT)
                {
                    decimal factor;
                    // determine the largest factor 
                    if (originalWidth / originalHeight > ASPECT_RATIO)
                    {
                        factor = originalWidth / MAX_WIDTH;
                        newWidth = Convert.ToInt32(originalWidth / factor);
                        newHeight = Convert.ToInt32(originalHeight / factor);
                    }
                    else
                    {
                        factor = originalHeight / MAX_HEIGHT;
                        newWidth = Convert.ToInt32(originalWidth / factor);
                        newHeight = Convert.ToInt32(originalHeight / factor);
                    }
                }
                else
                {
                    newWidth = width;
                    newHeight = height;
                }
                return new Size(newWidth, newHeight);
            }
            #endregion
        }

    备注:原文转载自C#生成图片的缩略图_IT技术小趣屋

    博主个人技术交流群:960640092,博主微信公众号如下:

  • 相关阅读:
    Androidstudio 使用git插件提交代码
    androidstudio上传代码到git上
    tcpdump的简单使用
    使用nmap工具查询局域网某个网段正在使用的ip地址
    网段的划分
    jenkins配置源码管理git
    shell条件测试test
    shell简单用法笔记(shell中数值运算)二
    shell简单用法笔记(一)
    如何解决audiodg占用内存高(停止与重启audiodg服务)
  • 原文地址:https://www.cnblogs.com/xu-yi/p/10623638.html
Copyright © 2011-2022 走看看