• C# 生成图片缩略图


        最近项目有部分需求,是关于图片操作部分的, 大致的功能就是图片的保存和展示。但是直接操作原图,程序运行效率太慢。而且如果传输数据量过大的话,可能直接导致调用WCF服务失败的问题。

        为了解决这个问题,决定采用缩略图的方法。保存数据的时候保存原图和其缩略图。但主界面展示的时候只加载缩略图,点击缩略图后再显示其原图。这样就避免了一进入主界面就加载大量数据,提高了效率。

        那么问题就来了,怎么将原图进行处理变成缩略图呢?

        下面提供了一个图片处理的类,用来生成缩略图。对GetReducedImage函数进行4次重载来完成不同的需求。

     

    using System.IO;
    using System.Drawing;
    using System.Drawing.Imaging;
    
    /// <summary>   
    /// 图片处理类   
    /// 1、生成缩略图片或按照比例改变图片的大小和画质   
    /// 2、将生成的缩略图放到指定的目录下   
    /// </summary>   
    public class ImageClass
    {
        public Image ResourceImage;
        private int ImageWidth;
        private int ImageHeight;
    
        public string ErrMessage;
    
        /// <summary>   
        /// 类的构造函数   
        /// </summary>   
        /// <param name="ImageFileName">图片文件的全路径名称</param>   
        public ImageClass(string ImageFileName)
        {
            ResourceImage = Image.FromFile(ImageFileName);
            ErrMessage = "";
        }
    
        public bool ThumbnailCallback()
        {
            return false;
        }
    
        /// <summary>   
        /// 生成缩略图重载方法1,返回缩略图的Image对象   
        /// </summary>   
        /// <param name="Width">缩略图的宽度</param>   
        /// <param name="Height">缩略图的高度</param>   
        /// <returns>缩略图的Image对象</returns>   
        public Image GetReducedImage(int Width, int Height)
        {
            try
            {
                Image ReducedImage;
    
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
    
                ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
    
                return ReducedImage;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return null;
            }
        }
    
        /// <summary>   
        /// 生成缩略图重载方法2,将缩略图文件保存到指定的路径   
        /// </summary>   
        /// <param name="Width">缩略图的宽度</param>   
        /// <param name="Height">缩略图的高度</param>   
        /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Images ilename.jpg</param>   
        /// <returns>成功返回true,否则返回false</returns>   
        public bool GetReducedImage(int Width, int Height, string targetFilePath)
        {
            try
            {
                Image ReducedImage;
    
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
    
                ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
                ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);
    
                ReducedImage.Dispose();
    
                return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return false;
            }
        }
    
        /// <summary>   
        /// 生成缩略图重载方法3,返回缩略图的Image对象   
        /// </summary>   
        /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param>     
        /// <returns>缩略图的Image对象</returns>   
        public Image GetReducedImage(double Percent)
        {
            try
            {
                Image ReducedImage;
    
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
    
                ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
                ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
    
                ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
    
                return ReducedImage;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return null;
            }
        }
    
        /// <summary>   
        /// 生成缩略图重载方法4,返回缩略图的Image对象   
        /// </summary>   
        /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param>     
        /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Images ilename.jpg</param>   
        /// <returns>成功返回true,否则返回false</returns>   
        public bool GetReducedImage(double Percent, string targetFilePath)
        {
            try
            {
                Image ReducedImage;
    
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
    
                ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
                ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
    
                ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
    
                ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);
    
                ReducedImage.Dispose();
    
                return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return false;
            }
        }
    
    }

     

    效果图:

    GetReducedImage(double Percent)方法测试了一下,传入缩略百分比 0.05

     

    原图大小为1M,处理后的图片大小仅几十KB,程序运行效率的确提高了不少。

     

  • 相关阅读:
    mall
    将UNICODE编码转换为中文
    460. LFU Cache
    957. Prison Cells After N Days
    455. Assign Cookies
    453. Minimum Moves to Equal Array Elements
    434. Number of Segments in a String
    1203. Sort Items by Groups Respecting Dependencies
    641. Design Circular Deque
    441. Arranging Coins
  • 原文地址:https://www.cnblogs.com/jara/p/4053401.html
Copyright © 2020-2023  润新知