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,程序运行效率的确提高了不少。

时间: 2024-08-05 23:20:14

C# 生成图片缩略图的相关文章

PHP 生成图片缩略图函数

各位小盆友使用前记得打开 GD 库的支持哦,附上代码. <?php /** * 生成缩略图函数(支持图片格式:gif.jpeg.png和bmp) * @author ruxing.li * @param string $src 源图片路径 * @param int $width 缩略图宽度(只指定高度时进行等比缩放) * @param int $width 缩略图高度(只指定宽度时进行等比缩放) * @param string $filename 保存路径(不指定时直接输出到浏览器) * @re

JAVA生成图片缩略图、JAVA截取图片局部内容

package com.ares.image.test; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Arrays; import javax.imageio.ImageIO; import o

php生成图片缩略图的类方法

//php生成缩略图片的类 class ResizeImage{ public $type;//图片类型 public $width;//实际宽度 public $height;//实际高度 public $resize_width;//改变后的宽度 public $resize_height;//改变后的高度 public $cut;//是否裁图 public $srcimg;//源图象 public $dstimg;//目标图象地址 public $im;//临时创建的图象 public $

生成图片缩略图方法

private void DrawImageRectRect(string rawImgPath, string newImgPath, int width, int height) { System.Drawing.Image imageFrom = System.Drawing.Image.FromFile(rawImgPath); // 源图宽度及高度 int imageFromWidth = imageFrom.Width; int imageFromHeight = imageFrom

java生成生成图片缩略图

/** * */ package com.fkhwl.fkhserver.core.utils; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageI

php生成图片缩略图,支持png透明

注:此功能依赖GD2图形库 PHP生成缩略图类 <?php /* * desc: Resize Image(png, jpg, gif) * author: 十年后的卢哥哥(http://www.cnblogs.com/lurenjiashuo/) * date: 2014.11.13 * base from: http://www.oschina.net/code/snippet_5189_2491 */ class ResizeImage { //图片类型 private $type; //

JAVA生成图片缩略图

package com.ares.image.test; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Arrays; import javax.imageio.ImageIO; import o

ThinkPHP5 动态生成图片缩略图

需求场景 不同终端(PC端.手机端.平板),不同界面(列表页.详情页),对图片大小的要求不一样, 如果所有场景下都使用同一尺寸的图片,势必对会网络带宽及服务器性能造成一定的影响,由此需要服务器端能够根据前端的请求参数,自动匹配出相对应的图片资源,以此来降低服务端的压力,同时也能给用户带来更友好的用户体验. 具体步骤如下: 1.开启apache的rewrite功能,具体方法请自行百度. 2.修改.htaccess 以上配置规则表示,如果存在对应的图片资源,则由apache直接返回,如果不存在,则转

Java 实现生成图片缩略图,缩小高清图片

import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.util.HashMap; import java.uti