zoukankan      html  css  js  c++  java
  • 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,程序运行效率的确提高了不少。

     

  • 相关阅读:
    手机端布局
    雪碧图优缺点
    es6的基本数据详解
    react生命周期函数
    第七周作业-使用Python实现抽样分布的验证(正态分布、卡方分布、T分布等)
    第六章统计量及其抽样分布
    Python实现概率分布(二项分布、伯努利分布、泊松分布、几何分布、正态分布等)
    4.概率与概率分布
    3.描述性统计
    统计学小组
  • 原文地址:https://www.cnblogs.com/jara/p/4053401.html
Copyright © 2011-2022 走看看