1. public class Thumbnail
  2. {
  3. private Image srcImage;
  4. private string srcFileName;
  5.  
  6. /// <summary>
  7. /// 创建
  8. /// </summary>
  9. /// <param name="FileName">原始图片路径</param>
  10. public bool SetImage(string FileName)
  11. {
  12. srcFileName = FileName;
  13. try
  14. {
  15. srcImage = Image.FromFile(srcFileName);
  16. }
  17. catch
  18. {
  19. return false;
  20. }
  21. return true;
  22.  
  23. }
  24.  
  25. /// <summary>
  26. /// 回调
  27. /// </summary>
  28. /// <returns></returns>
  29. public static bool ThumbnailCallback()
  30. {
  31. return false;
  32. }
  33.  
  34. /// <summary>
  35. /// 生成缩略图,返回缩略图的Image对象
  36. /// </summary>
  37. /// <param name="Width">缩略图宽度</param>
  38. /// <param name="Height">缩略图高度</param>
  39. /// <returns>缩略图的Image对象</returns>
  40. public Image GetImage(int Width, int Height)
  41. {
  42. Image img;
  43. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  44. img = srcImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
  45. return img;
  46. }
  47.  
  48. /// <summary>
  49. /// 保存缩略图
  50. /// </summary>
  51. /// <param name="Width"></param>
  52. /// <param name="Height"></param>
  53. public void SaveThumbnailImage(int Width, int Height)
  54. {
  55. switch (Path.GetExtension(srcFileName).ToLower())
  56. {
  57. case ".png":
  58. SaveImage(Width, Height, ImageFormat.Png);
  59. break;
  60. case ".gif":
  61. SaveImage(Width, Height, ImageFormat.Gif);
  62. break;
  63. default:
  64. SaveImage(Width, Height, ImageFormat.Jpeg);
  65. break;
  66. }
  67. }
  68.  
  69. /// <summary>
  70. /// 生成缩略图并保存
  71. /// </summary>
  72. /// <param name="Width">缩略图的宽度</param>
  73. /// <param name="Height">缩略图的高度</param>
  74. /// <param name="imgformat">保存的图像格式</param>
  75. /// <returns>缩略图的Image对象</returns>
  76. public void SaveImage(int Width, int Height, ImageFormat imgformat)
  77. {
  78. if (imgformat != ImageFormat.Gif && (srcImage.Width > Width) || (srcImage.Height > Height))
  79. {
  80. Image img;
  81. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  82. img = srcImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
  83. srcImage.Dispose();
  84. img.Save(srcFileName, imgformat);
  85. img.Dispose();
  86. }
  87. }
  88.  
  89. #region Helper
  90.  
  91. /// <summary>
  92. /// 保存图片
  93. /// </summary>
  94. /// <param name="image">Image 对象</param>
  95. /// <param name="savePath">保存路径</param>
  96. /// <param name="ici">指定格式的编解码参数</param>
  97. private static void SaveImage(Image image, string savePath, ImageCodecInfo ici)
  98. {
  99. //设置 原图片 对象的 EncoderParameters 对象
  100. EncoderParameters parameters = new EncoderParameters();
  101. parameters.Param[] = new EncoderParameter(Encoder.Quality, ((long)));
  102. image.Save(savePath, ici, parameters);
  103. parameters.Dispose();
  104. }
  105.  
  106. /// <summary>
  107. /// 获取图像编码解码器的所有相关信息
  108. /// </summary>
  109. /// <param name="mimeType">包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串</param>
  110. /// <returns>返回图像编码解码器的所有相关信息</returns>
  111. private static ImageCodecInfo GetCodecInfo(string mimeType)
  112. {
  113. ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
  114. foreach (ImageCodecInfo ici in CodecInfo)
  115. {
  116. if (ici.MimeType == mimeType)
  117. return ici;
  118. }
  119. return null;
  120. }
  121.  
  122. /// <summary>
  123. /// 计算新尺寸
  124. /// </summary>
  125. /// <param name="width">原始宽度</param>
  126. /// <param name="height">原始高度</param>
  127. /// <param name="maxWidth">最大新宽度</param>
  128. /// <param name="maxHeight">最大新高度</param>
  129. /// <returns></returns>
  130. private static Size ResizeImage(int width, int height, int maxWidth, int maxHeight)
  131. {
  132. decimal MAX_WIDTH = (decimal)maxWidth;
  133. decimal MAX_HEIGHT = (decimal)maxHeight;
  134. decimal ASPECT_RATIO = MAX_WIDTH / MAX_HEIGHT;
  135.  
  136. int newWidth, newHeight;
  137. decimal originalWidth = (decimal)width;
  138. decimal originalHeight = (decimal)height;
  139.  
  140. if (originalWidth > MAX_WIDTH || originalHeight > MAX_HEIGHT)
  141. {
  142. decimal factor;
  143. // determine the largest factor
  144. if (originalWidth / originalHeight > ASPECT_RATIO)
  145. {
  146. factor = originalWidth / MAX_WIDTH;
  147. newWidth = Convert.ToInt32(originalWidth / factor);
  148. newHeight = Convert.ToInt32(originalHeight / factor);
  149. }
  150. else
  151. {
  152. factor = originalHeight / MAX_HEIGHT;
  153. newWidth = Convert.ToInt32(originalWidth / factor);
  154. newHeight = Convert.ToInt32(originalHeight / factor);
  155. }
  156. }
  157. else
  158. {
  159. newWidth = width;
  160. newHeight = height;
  161. }
  162. return new Size(newWidth, newHeight);
  163. }
  164.  
  165. /// <summary>
  166. /// 得到图片格式
  167. /// </summary>
  168. /// <param name="name">文件名称</param>
  169. /// <returns></returns>
  170. public static ImageFormat GetFormat(string name)
  171. {
  172. string ext = name.Substring(name.LastIndexOf(".") + );
  173. switch (ext.ToLower())
  174. {
  175. case "jpg":
  176. case "jpeg":
  177. return ImageFormat.Jpeg;
  178. case "bmp":
  179. return ImageFormat.Bmp;
  180. case "png":
  181. return ImageFormat.Png;
  182. case "gif":
  183. return ImageFormat.Gif;
  184. default:
  185. return ImageFormat.Jpeg;
  186. }
  187. }
  188. #endregion
  189.  
  190. /// <summary>
  191. /// 制作小正方形
  192. /// </summary>
  193. /// <param name="fileName">原图的文件路径</param>
  194. /// <param name="newFileName">新地址</param>
  195. /// <param name="newSize">长度或宽度</param>
  196. public static void MakeSquareImage(string fileName, string newFileName, int newSize)
  197. {
  198. Image image = Image.FromFile(fileName);
  199.  
  200. int i = ;
  201. int width = image.Width;
  202. int height = image.Height;
  203. if (width > height)
  204. i = height;
  205. else
  206. i = width;
  207.  
  208. Bitmap b = new Bitmap(newSize, newSize);
  209.  
  210. try
  211. {
  212. Graphics g = Graphics.FromImage(b);
  213. g.InterpolationMode = InterpolationMode.High;
  214. g.SmoothingMode = SmoothingMode.HighQuality;
  215.  
  216. //清除整个绘图面并以透明背景色填充
  217. g.Clear(Color.Transparent);
  218. if (width < height)
  219. g.DrawImage(image, new Rectangle(, , newSize, newSize), new Rectangle(, (height - width) / , width, width), GraphicsUnit.Pixel);
  220. else
  221. g.DrawImage(image, new Rectangle(, , newSize, newSize), new Rectangle((width - height) / , , height, height), GraphicsUnit.Pixel);
  222.  
  223. SaveImage(b, newFileName, GetCodecInfo("image/" + GetFormat(fileName).ToString().ToLower()));
  224. }
  225. finally
  226. {
  227. image.Dispose();
  228. b.Dispose();
  229. }
  230. }
  231.  
  232. /// <summary>
  233. /// 制作缩略图
  234. /// </summary>
  235. /// <param name="fileName">原图路径</param>
  236. /// <param name="newFileName">新图路径</param>
  237. /// <param name="maxWidth">最大宽度</param>
  238. /// <param name="maxHeight">最大高度</param>
  239. public static void MakeThumbnailImage(string fileName, string newFileName, int maxWidth, int maxHeight)
  240. {
  241. Image original = Image.FromFile(fileName);
  242. Size _newSize = ResizeImage(original.Width, original.Height, maxWidth, maxHeight);
  243. Image displayImage = new Bitmap(original, _newSize);
  244.  
  245. try
  246. {
  247. displayImage.Save(newFileName, GetFormat(fileName));
  248. }
  249. finally
  250. {
  251. original.Dispose();
  252. }
  253. }
  254.  
  255. /// <summary>
  256. /// 生成缩略图,返回缩略图的Image对象
  257. /// </summary>
  258. /// <param name="rawImage">原始图片</param>
  259. /// <param name="Width">缩略图宽度</param>
  260. /// <param name="Height">缩略图高度</param>
  261. /// <returns>缩略图的Image对象</returns>
  262. public static Image MakeThumbnailImage(Image rawImage, int Width, int Height)
  263. {
  264. if (rawImage.Width == Width && rawImage.Height == Height)
  265. {
  266. return rawImage;
  267. }
  268. else
  269. {
  270. Size _newSize = new Size(Width, Height);
  271. return new Bitmap(rawImage, _newSize);
  272. }
  273. }
  274.  
  275. /// <summary>
  276. /// 将字节数组转换为图片
  277. /// </summary>
  278. /// <returns></returns>
  279. public static Image GetImageByBytes(byte[] bytes)
  280. {
  281. Image photo = null;
  282. if (bytes != null && !bytes.Equals(null))
  283. {
  284. using (MemoryStream ms = new MemoryStream(bytes))
  285. {
  286. try
  287. {
  288. photo = Image.FromStream(ms, true);
  289. }
  290. catch
  291. {
  292. }
  293. }
  294. }
  295. return photo;
  296. }
  297.  
  298. /// <summary>
  299. /// 转化图片为Byte数组
  300. /// </summary>
  301. /// <param name="pb"></param>
  302. /// <returns></returns>
  303. public static byte[] GetBytesByImage(Image pb)
  304. {
  305. byte[] photo_byte = null;
  306.  
  307. if (pb != null)
  308. {
  309. using (MemoryStream ms = new MemoryStream())
  310. {
  311. Bitmap bmp = new Bitmap(pb);
  312. bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  313. photo_byte = new byte[ms.Length];
  314. ms.Position = ;
  315. ms.Read(photo_byte, , Convert.ToInt32(ms.Length));
  316. bmp.Dispose();
  317. }
  318. }
  319.  
  320. return photo_byte;
  321. }
  322. }

Thumbnail 图片帮助的更多相关文章

  1. iOS遍历相册中的图片

    //获取相册的所有图片 - (void)reloadImagesFromLibrary { self.images = [[NSMutableArray alloc] init]; dispatch_ ...

  2. ios-获取系统相簿里边的所有照片

    #import<AssetsLibrary/AssetsLibrary.h> -(void)getImgs{ dispatch_async(dispatch_get_main_queue( ...

  3. Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,相似图片浏览器

    MAC : XCode -> Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,类似图片浏览器 STEP1:将两个目录复制到project里面ImageBrowser ...

  4. 使用Python PIL库中的Image.thumbnail函数裁剪图片

    今天,是我来到博客园的第五天,发现自己还没有头像,想着上传ubuntu系统中我很喜欢的一个背景图片来当头像,但是因为图片过大,上传失败了.那么,我们如何使用python中强大的PIL库来进行图片裁剪呢 ...

  5. 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  6. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  7. 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示

    在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...

  8. yii2图片处理扩展yii2-imagine的使用

    示例控制器: <?php /** * 图片常用处理 * * 需要 yii/yii2-imagine 的支持 * php composer.phar require --prefer-dist y ...

  9. .net MVC 简单图片上传

    主要完成的是在网页上 上传一张图片到服务器 我搜出来的上传文件代码都特别复杂,对于初学者来说,先解决能上传的问题才最重要,并不需要特别多的功能,仅适合不会上传的初学者,大神请绕路,错误请指出,谢谢 v ...

随机推荐

  1. Android 控件之Spinner

    Spinner用来显示列表项,类似于一组单选框RadioButton.下面瞥一下它的效果. 源码下载 一.概述 Spinner是一个每次只能选择所有项的一个项的控件.它的项来自于与之相关联的适配器中. ...

  2. .com .cn .org .edu等域名的意义

    在开发的时候遇到了.org的域名,后来就去查了一下,原来这种域名是非盈利组织或者协会的标志 比如: https://getcomposer.org/ https://packagist.org/ ht ...

  3. 【转】学习使用Jmeter做压力测试(二)--压力测试的实施

    JMeter测试步骤: 1.建立测试计划 2.添加线程组 3.添加HTTP请求 4.增加监听器 5.执行测试计划 6.根据JMeter提供的报告分析结果 一.目标 测试访问目标服务器网站首页的每秒查询 ...

  4. xunsearch进阶使用

    目录 设置分页 设置排序 读取文档结果 搜索结果高亮处理 获取数量 获取热门搜索词 获取相关搜索词 设置分页 $search->setLimit(5); // 设置返回结果为前 5 条 $sea ...

  5. model进阶(queryset,中介模型,查询优化,extra)

    queryset 方法 ############# 可切片 def queryTest(request): ret = models.Atricle.objects.all() 数据库查询 print ...

  6. 使用模板创建第一个Web API项目

    软件环境 vs 2015 update3 本节将通过例子讲述创建Web API 项目的方法 第一步,打开vs ,依次通过[文件]菜单,[新建][项目]命令,大致步骤如下图 :   第2步,在弹出对话框 ...

  7. python's twenty-sixth day for me 模块

    configparser 模块: 该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键 = 值). 创建文件: # 创建文件 i ...

  8. list map set 集合的区别

    Java中的集合包括三大类,它们是Set.List和Map,它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现 类.Set的实现类主要有HashSet和TreeSet ...

  9. MySql主从复制原理和环境配置搭建

    主从复制原理 实质就是通过二进制的sql文件实现主从复制 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlo ...

  10. JS播放声音 兼容所有浏览器

    JS播放声音 兼容所有浏览器 <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http ...