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

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

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

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

  1. using System.IO;
  2. using System.Drawing;
  3. using System.Drawing.Imaging;
  4.  
  5. /// <summary>
  6. /// 图片处理类
  7. /// 1、生成缩略图片或按照比例改变图片的大小和画质
  8. /// 2、将生成的缩略图放到指定的目录下
  9. /// </summary>
  10. public class ImageClass
  11. {
  12. public Image ResourceImage;
  13. private int ImageWidth;
  14. private int ImageHeight;
  15.  
  16. public string ErrMessage;
  17.  
  18. /// <summary>
  19. /// 类的构造函数
  20. /// </summary>
  21. /// <param name="ImageFileName">图片文件的全路径名称</param>
  22. public ImageClass(string ImageFileName)
  23. {
  24. ResourceImage = Image.FromFile(ImageFileName);
  25. ErrMessage = "";
  26. }
  27.  
  28. public bool ThumbnailCallback()
  29. {
  30. return false;
  31. }
  32.  
  33. /// <summary>
  34. /// 生成缩略图重载方法1,返回缩略图的Image对象
  35. /// </summary>
  36. /// <param name="Width">缩略图的宽度</param>
  37. /// <param name="Height">缩略图的高度</param>
  38. /// <returns>缩略图的Image对象</returns>
  39. public Image GetReducedImage(int Width, int Height)
  40. {
  41. try
  42. {
  43. Image ReducedImage;
  44.  
  45. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  46.  
  47. ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
  48.  
  49. return ReducedImage;
  50. }
  51. catch (Exception e)
  52. {
  53. ErrMessage = e.Message;
  54. return null;
  55. }
  56. }
  57.  
  58. /// <summary>
  59. /// 生成缩略图重载方法2,将缩略图文件保存到指定的路径
  60. /// </summary>
  61. /// <param name="Width">缩略图的宽度</param>
  62. /// <param name="Height">缩略图的高度</param>
  63. /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Images ilename.jpg</param>
  64. /// <returns>成功返回true,否则返回false</returns>
  65. public bool GetReducedImage(int Width, int Height, string targetFilePath)
  66. {
  67. try
  68. {
  69. Image ReducedImage;
  70.  
  71. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  72.  
  73. ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
  74. ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);
  75.  
  76. ReducedImage.Dispose();
  77.  
  78. return true;
  79. }
  80. catch (Exception e)
  81. {
  82. ErrMessage = e.Message;
  83. return false;
  84. }
  85. }
  86.  
  87. /// <summary>
  88. /// 生成缩略图重载方法3,返回缩略图的Image对象
  89. /// </summary>
  90. /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param>
  91. /// <returns>缩略图的Image对象</returns>
  92. public Image GetReducedImage(double Percent)
  93. {
  94. try
  95. {
  96. Image ReducedImage;
  97.  
  98. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  99.  
  100. ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
  101. ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
  102.  
  103. ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
  104.  
  105. return ReducedImage;
  106. }
  107. catch (Exception e)
  108. {
  109. ErrMessage = e.Message;
  110. return null;
  111. }
  112. }
  113.  
  114. /// <summary>
  115. /// 生成缩略图重载方法4,返回缩略图的Image对象
  116. /// </summary>
  117. /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param>
  118. /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Images ilename.jpg</param>
  119. /// <returns>成功返回true,否则返回false</returns>
  120. public bool GetReducedImage(double Percent, string targetFilePath)
  121. {
  122. try
  123. {
  124. Image ReducedImage;
  125.  
  126. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  127.  
  128. ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
  129. ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
  130.  
  131. ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
  132.  
  133. ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);
  134.  
  135. ReducedImage.Dispose();
  136.  
  137. return true;
  138. }
  139. catch (Exception e)
  140. {
  141. ErrMessage = e.Message;
  142. return false;
  143. }
  144. }
  145.  
  146. }

效果图:

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

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

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

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

    package com.ares.image.test; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; ...

  2. PHP原生写的生成图片缩略图类

    PHP原生写的生成图片缩略图类,本文以京东商品图片为例,分别生成三种不同尺寸的图片.调用方法很简单只要传参数高度和宽度,及新图片的名称. 引入缩略图类 include_once 'ImageResiz ...

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

    //php生成缩略图片的类 class ResizeImage{ public $type;//图片类型 public $width;//实际宽度 public $height;//实际高度 publ ...

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

    注:此功能依赖GD2图形库 PHP生成缩略图类   <?php /* * desc: Resize Image(png, jpg, gif) * author: 十年后的卢哥哥(http://w ...

  5. C#生成图片缩略图(2种思路)

    前言:在日常图片浏览中,如果图片过多,只有一张张的打开图片才能知道图片的内容,显然这样浏览起来非常不便.Windows系统在浏览图片时提供了缩略图的功能,这样大大的方便了浏览者了解每张图片的内容,本实 ...

  6. PHP 生成图片缩略图函数

    <?php /** * 生成缩略图函数(支持图片格式:gif.jpeg.png和bmp) * @author ruxing.li * @param string $src 源图片路径 * @pa ...

  7. java生成生成图片缩略图

    /** * */ package com.fkhwl.fkhserver.core.utils; import java.awt.Image; import java.awt.image.Buffer ...

  8. Python——使用第三方库Pillow生成图片缩略图

    流程如下: 1.首先确认是否安装了pip 在命令提示符窗口下输入pip,如果Windows提示未找到命令,可以重新运行安装程序添加pip. 2.在命令提示符窗口下输入pip install Pillo ...

  9. php使用GD库实现图片水印和缩略图——生成图片缩略图

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

随机推荐

  1. 【Unity Shader编程】之十六 基于MatCap实现适于移动平台的“次时代”车漆Shader

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/55803629 渲染本文配图使用的 ...

  2. WebRtc(网页即时通讯技术)知识点总结

    前言 WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,简而言之它是一个支持网页浏览器进行实时语音对话或视频对话的技术.并且还支持跨平台:window ...

  3. 【云安全与同态加密_调研分析(4)】云计算安全领域主要研究成果——By Me

    下表列举了在云安全问题研究表现突出的ICT公司和研究机构以及其在云计算安全方面主要研究成果: ◆ICT公司和研究机构(云计算安全领域主要研究成果)◆ ◆机构名称◆ ◆机构类别◆ ◆主要研究成果◆ ◆备 ...

  4. 你知道军装照H5浏览了多少次吗? 10亿

    7月29日,由人民日报客户端推出的<快看呐!这是我的军装照>(以下简称<军装照>)H5页面,由它所引发的全民晒“军装照”现象级事件,据统计,截至8月18日,<军装照> ...

  5. go-008-循环语句

    一.循环语句[只有for] 1.基础结构: Go语言的For循环有3中形式,只有其中的一种使用分号. 和 C 语言的 for 一样: for init; condition; post { } 和 C ...

  6. Spark Streaming实战

    1.Storm 和 SparkStreaming区别 Storm                      纯实时的流式处理,来一条数据就立即进行处理 SparkStreaming 微批处理,每次处理 ...

  7. CCF 201312-3 最大的矩形[比较简单]

    问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...

  8. 谷歌浏览器不能打开本地HTML文件

    打开浏览器右上角菜单——>更多工具——>扩展程序——>将Axure RP Extension For Chrome 0.62.crx文件拖入——>成功后,勾选相关选项 文件的下 ...

  9. Linux系统——最小化安装

    一.虚拟机进行Linux minimal 安装 网络连接:选择“自定义”——>VMnet8(NAT模式) #PC与NAT网络的虚拟机在不同网段,此时虚拟网卡作为网关建立通信 NAT模式可直接上I ...

  10. BitmapFactory.decodeStream(inputStream)返回null的解决方法

    场景:Android,通过inputStream从网络上获取图片 随后两次使用BitmapFactory对InputStream进行操作,一次获取宽高,另一次缩放 但是在缩放时,发现inputStre ...