市长热线演示版

Thumbnail.cs 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Drawing2D;
  4. using System.Drawing.Imaging;
  5. using System.IO;
  6. using System.Net;
  7. namespace HySoft.Common
  8. {
  9. /// <summary>
  10. /// Thumbnail 的摘要说明。
  11. /// </summary>
  12. public class Thumbnail
  13. {
  14. private Image srcImage;
  15. private string srcFileName;
  16. /// <summary>
  17. /// 创建
  18. /// </summary>
  19. /// <param name="FileName">原始图片路径</param>
  20. public bool SetImage(string FileName)
  21. {
  22. srcFileName = Utils.GetMapPath(FileName);
  23. try
  24. {
  25. srcImage = Image.FromFile(srcFileName);
  26. }
  27. catch
  28. {
  29. return false;
  30. }
  31. return true;
  32. }
  33. /// <summary>
  34. /// 回调
  35. /// </summary>
  36. /// <returns></returns>
  37. public bool ThumbnailCallback()
  38. {
  39. return false;
  40. }
  41. /// <summary>
  42. /// 生成缩略图,返回缩略图的Image对象
  43. /// </summary>
  44. /// <param name="Width">缩略图宽度</param>
  45. /// <param name="Height">缩略图高度</param>
  46. /// <returns>缩略图的Image对象</returns>
  47. public Image GetImage(int Width,int Height)
  48. {
  49. Image img;
  50. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  51. img = srcImage.GetThumbnailImage(Width,Height,callb, IntPtr.Zero);
  52. return img;
  53. }
  54. /// <summary>
  55. /// 保存缩略图
  56. /// </summary>
  57. /// <param name="Width"></param>
  58. /// <param name="Height"></param>
  59. public void SaveThumbnailImage(int Width,int Height)
  60. {
  61. switch(Path.GetExtension(srcFileName).ToLower())
  62. {
  63. case ".png":
  64. SaveImage(Width, Height, ImageFormat.Png);
  65. break;
  66. case ".gif":
  67. SaveImage(Width, Height, ImageFormat.Gif);
  68. break;
  69. default:
  70. SaveImage(Width, Height, ImageFormat.Jpeg);
  71. break;
  72. }
  73. }
  74. /// <summary>
  75. /// 生成缩略图并保存
  76. /// </summary>
  77. /// <param name="Width">缩略图的宽度</param>
  78. /// <param name="Height">缩略图的高度</param>
  79. /// <param name="imgformat">保存的图像格式</param>
  80. /// <returns>缩略图的Image对象</returns>
  81. public void SaveImage(int Width,int Height, ImageFormat imgformat)
  82. {
  83. if (imgformat != ImageFormat.Gif && (srcImage.Width > Width) || (srcImage.Height > Height))
  84. {
  85. Image img;
  86. Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  87. img = srcImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
  88. srcImage.Dispose();
  89. img.Save(srcFileName, imgformat);
  90. img.Dispose();
  91. }
  92. }
  93. #region Helper
  94. /// <summary>
  95. /// 保存图片
  96. /// </summary>
  97. /// <param name="image">Image 对象</param>
  98. /// <param name="savePath">保存路径</param>
  99. /// <param name="ici">指定格式的编解码参数</param>
  100. private static void SaveImage(Image image, string savePath, ImageCodecInfo ici)
  101. {
  102. //设置 原图片 对象的 EncoderParameters 对象
  103. EncoderParameters parameters = new EncoderParameters(1);
  104. parameters.Param[0] = new EncoderParameter(Encoder.Quality, ((long) 100));
  105. image.Save(savePath, ici, parameters);
  106. parameters.Dispose();
  107. }
  108. /// <summary>
  109. /// 获取图像编码解码器的所有相关信息
  110. /// </summary>
  111. /// <param name="mimeType">包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串</param>
  112. /// <returns>返回图像编码解码器的所有相关信息</returns>
  113. private static ImageCodecInfo GetCodecInfo(string mimeType)
  114. {
  115. ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
  116. foreach(ImageCodecInfo ici in CodecInfo)
  117. {
  118. if(ici.MimeType == mimeType)
  119. return ici;
  120. }
  121. return null;
  122. }
  123. /// <summary>
  124. /// 计算新尺寸
  125. /// </summary>
  126. /// <param name="width">原始宽度</param>
  127. /// <param name="height">原始高度</param>
  128. /// <param name="maxWidth">最大新宽度</param>
  129. /// <param name="maxHeight">最大新高度</param>
  130. /// <returns></returns>
  131. private static Size ResizeImage(int width, int height, int maxWidth, int maxHeight)
  132. {
  133. //此次2012-02-05修改过=================
  134. if (maxWidth <= 0)
  135. maxWidth = width;
  136. if (maxHeight <= 0)
  137. maxHeight = height;
  138. //以上2012-02-05修改过=================
  139. decimal MAX_WIDTH = (decimal)maxWidth;
  140. decimal MAX_HEIGHT = (decimal)maxHeight;
  141. decimal ASPECT_RATIO = MAX_WIDTH / MAX_HEIGHT;
  142. int newWidth, newHeight;
  143. decimal originalWidth = (decimal)width;
  144. decimal originalHeight = (decimal)height;
  145. if (originalWidth > MAX_WIDTH || originalHeight > MAX_HEIGHT)
  146. {
  147. decimal factor;
  148. // determine the largest factor
  149. if (originalWidth / originalHeight > ASPECT_RATIO)
  150. {
  151. factor = originalWidth / MAX_WIDTH;
  152. newWidth = Convert.ToInt32(originalWidth / factor);
  153. newHeight = Convert.ToInt32(originalHeight / factor);
  154. }
  155. else
  156. {
  157. factor = originalHeight / MAX_HEIGHT;
  158. newWidth = Convert.ToInt32(originalWidth / factor);
  159. newHeight = Convert.ToInt32(originalHeight / factor);
  160. }
  161. }
  162. else
  163. {
  164. newWidth = width;
  165. newHeight = height;
  166. }
  167. return new Size(newWidth,newHeight);
  168. }
  169. /// <summary>
  170. /// 得到图片格式
  171. /// </summary>
  172. /// <param name="name">文件名称</param>
  173. /// <returns></returns>
  174. public static ImageFormat GetFormat(string name)
  175. {
  176. string ext = name.Substring(name.LastIndexOf(".") + 1);
  177. switch (ext.ToLower())
  178. {
  179. case "jpg":
  180. case "jpeg":
  181. return ImageFormat.Jpeg;
  182. case "bmp":
  183. return ImageFormat.Bmp;
  184. case "png":
  185. return ImageFormat.Png;
  186. case "gif":
  187. return ImageFormat.Gif;
  188. default:
  189. return ImageFormat.Jpeg;
  190. }
  191. }
  192. #endregion
  193. /// <summary>
  194. /// 制作小正方形
  195. /// </summary>
  196. /// <param name="image">图片对象</param>
  197. /// <param name="newFileName">新地址</param>
  198. /// <param name="newSize">长度或宽度</param>
  199. public static void MakeSquareImage(Image image, string newFileName, int newSize)
  200. {
  201. int i = 0;
  202. int width = image.Width;
  203. int height = image.Height;
  204. if (width > height)
  205. i = height;
  206. else
  207. i = width;
  208. Bitmap b = new Bitmap(newSize, newSize);
  209. try
  210. {
  211. Graphics g = Graphics.FromImage(b);
  212. //设置高质量插值法
  213. g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  214. //设置高质量,低速度呈现平滑程度
  215. g.SmoothingMode = SmoothingMode.AntiAlias;
  216. g.PixelOffsetMode = PixelOffsetMode.HighQuality;
  217. //清除整个绘图面并以透明背景色填充
  218. g.Clear(Color.Transparent);
  219. if (width < height)
  220. g.DrawImage(image, new Rectangle(0, 0, newSize, newSize), new Rectangle(0, (height-width)/2, width, width), GraphicsUnit.Pixel);
  221. else
  222. g.DrawImage(image, new Rectangle(0, 0, newSize, newSize), new Rectangle((width-height)/2, 0, height, height), GraphicsUnit.Pixel);
  223. SaveImage(b, newFileName, GetCodecInfo("image/" + GetFormat(newFileName).ToString().ToLower()));
  224. }
  225. finally
  226. {
  227. image.Dispose();
  228. b.Dispose();
  229. }
  230. }
  231. /// <summary>
  232. /// 制作小正方形
  233. /// </summary>
  234. /// <param name="fileName">图片文件名</param>
  235. /// <param name="newFileName">新地址</param>
  236. /// <param name="newSize">长度或宽度</param>
  237. public static void MakeSquareImage(string fileName, string newFileName, int newSize)
  238. {
  239. MakeSquareImage(Image.FromFile(fileName), newFileName, newSize);
  240. }
  241. /// <summary>
  242. /// 制作远程小正方形
  243. /// </summary>
  244. /// <param name="url">图片url</param>
  245. /// <param name="newFileName">新地址</param>
  246. /// <param name="newSize">长度或宽度</param>
  247. public static void MakeRemoteSquareImage(string url, string newFileName, int newSize)
  248. {
  249. Stream stream = GetRemoteImage(url);
  250. if (stream == null)
  251. return;
  252. Image original = Image.FromStream(stream);
  253. stream.Close();
  254. MakeSquareImage(original, newFileName, newSize);
  255. }
  256. /// <summary>
  257. /// 制作缩略图
  258. /// </summary>
  259. /// <param name="original">图片对象</param>
  260. /// <param name="newFileName">新图路径</param>
  261. /// <param name="maxWidth">最大宽度</param>
  262. /// <param name="maxHeight">最大高度</param>
  263. public static void MakeThumbnailImage(Image original, string newFileName, int maxWidth, int maxHeight)
  264. {
  265. Size _newSize = ResizeImage(original.Width,original.Height,maxWidth, maxHeight);
  266. using (Image displayImage = new Bitmap(original, _newSize))
  267. {
  268. try
  269. {
  270. displayImage.Save(newFileName, original.RawFormat);
  271. }
  272. finally
  273. {
  274. original.Dispose();
  275. }
  276. }
  277. }
  278. /// <summary>
  279. /// 制作缩略图
  280. /// </summary>
  281. /// <param name="fileName">文件名</param>
  282. /// <param name="newFileName">新图路径</param>
  283. /// <param name="maxWidth">最大宽度</param>
  284. /// <param name="maxHeight">最大高度</param>
  285. public static void MakeThumbnailImage(string fileName, string newFileName, int maxWidth, int maxHeight)
  286. {
  287. //2012-02-05修改过,支持替换
  288. byte[] imageBytes = File.ReadAllBytes(fileName);
  289. Image img = Image.FromStream(new System.IO.MemoryStream(imageBytes));
  290. MakeThumbnailImage(img, newFileName, maxWidth, maxHeight);
  291. //原文
  292. //MakeThumbnailImage(Image.FromFile(fileName), newFileName, maxWidth, maxHeight);
  293. }
  294. #region 2012-2-19 新增生成图片缩略图方法
  295. /// <summary>
  296. /// 生成缩略图
  297. /// </summary>
  298. /// <param name="fileName">源图路径(绝对路径)</param>
  299. /// <param name="newFileName">缩略图路径(绝对路径)</param>
  300. /// <param name="width">缩略图宽度</param>
  301. /// <param name="height">缩略图高度</param>
  302. /// <param name="mode">生成缩略图的方式</param>
  303. public static void MakeThumbnailImage(string fileName, string newFileName, int width, int height, string mode)
  304. {
  305. Image originalImage = Image.FromFile(fileName);
  306. int towidth = width;
  307. int toheight = height;
  308. int x = 0;
  309. int y = 0;
  310. int ow = originalImage.Width;
  311. int oh = originalImage.Height;
  312. switch (mode)
  313. {
  314. case "HW"://指定高宽缩放(可能变形)
  315. break;
  316. case "W"://指定宽,高按比例
  317. toheight = originalImage.Height * width / originalImage.Width;
  318. break;
  319. case "H"://指定高,宽按比例
  320. towidth = originalImage.Width * height / originalImage.Height;
  321. break;
  322. case "Cut"://指定高宽裁减(不变形)
  323. if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
  324. {
  325. oh = originalImage.Height;
  326. ow = originalImage.Height * towidth / toheight;
  327. y = 0;
  328. x = (originalImage.Width - ow) / 2;
  329. }
  330. else
  331. {
  332. ow = originalImage.Width;
  333. oh = originalImage.Width * height / towidth;
  334. x = 0;
  335. y = (originalImage.Height - oh) / 2;
  336. }
  337. break;
  338. default:
  339. break;
  340. }
  341. //新建一个bmp图片
  342. Bitmap b = new Bitmap(towidth, toheight);
  343. try
  344. {
  345. //新建一个画板
  346. Graphics g = Graphics.FromImage(b);
  347. //设置高质量插值法
  348. g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  349. //设置高质量,低速度呈现平滑程度
  350. g.SmoothingMode = SmoothingMode.AntiAlias;
  351. g.PixelOffsetMode = PixelOffsetMode.HighQuality;
  352. //清空画布并以透明背景色填充
  353. g.Clear(Color.Transparent);
  354. //在指定位置并且按指定大小绘制原图片的指定部分
  355. g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
  356. SaveImage(b, newFileName, GetCodecInfo("image/" + GetFormat(newFileName).ToString().ToLower()));
  357. }
  358. catch (System.Exception e)
  359. {
  360. throw e;
  361. }
  362. finally
  363. {
  364. originalImage.Dispose();
  365. b.Dispose();
  366. }
  367. }
  368. #endregion
  369. #region 2012-10-30 新增图片裁剪方法
  370. /// <summary>
  371. /// 裁剪图片并保存
  372. /// </summary>
  373. /// <param name="fileName">源图路径(绝对路径)</param>
  374. /// <param name="newFileName">缩略图路径(绝对路径)</param>
  375. /// <param name="maxWidth">缩略图宽度</param>
  376. /// <param name="maxHeight">缩略图高度</param>
  377. /// <param name="cropWidth">裁剪宽度</param>
  378. /// <param name="cropHeight">裁剪高度</param>
  379. /// <param name="X">X轴</param>
  380. /// <param name="Y">Y轴</param>
  381. public static bool MakeThumbnailImage(string fileName, string newFileName, int maxWidth, int maxHeight, int cropWidth, int cropHeight, int X, int Y)
  382. {
  383. byte[] imageBytes = File.ReadAllBytes(fileName);
  384. Image originalImage = Image.FromStream(new System.IO.MemoryStream(imageBytes));
  385. Bitmap b = new Bitmap(cropWidth, cropHeight);
  386. try
  387. {
  388. using (Graphics g = Graphics.FromImage(b))
  389. {
  390. //设置高质量插值法
  391. g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  392. //设置高质量,低速度呈现平滑程度
  393. g.SmoothingMode = SmoothingMode.AntiAlias;
  394. g.PixelOffsetMode = PixelOffsetMode.HighQuality;
  395. //清空画布并以透明背景色填充
  396. g.Clear(Color.Transparent);
  397. //在指定位置并且按指定大小绘制原图片的指定部分
  398. g.DrawImage(originalImage, new Rectangle(0, 0, cropWidth, cropHeight), X, Y, cropWidth, cropHeight, GraphicsUnit.Pixel);
  399. Image displayImage = new Bitmap(b, maxWidth, maxHeight);
  400. SaveImage(displayImage, newFileName, GetCodecInfo("image/" + GetFormat(newFileName).ToString().ToLower()));
  401. return true;
  402. }
  403. }
  404. catch (System.Exception e)
  405. {
  406. throw e;
  407. }
  408. finally
  409. {
  410. originalImage.Dispose();
  411. b.Dispose();
  412. }
  413. }
  414. #endregion
  415. /// <summary>
  416. /// 制作远程缩略图
  417. /// </summary>
  418. /// <param name="url">图片URL</param>
  419. /// <param name="newFileName">新图路径</param>
  420. /// <param name="maxWidth">最大宽度</param>
  421. /// <param name="maxHeight">最大高度</param>
  422. public static void MakeRemoteThumbnailImage(string url, string newFileName, int maxWidth, int maxHeight)
  423. {
  424. Stream stream = GetRemoteImage(url);
  425. if(stream == null)
  426. return;
  427. Image original = Image.FromStream(stream);
  428. stream.Close();
  429. MakeThumbnailImage(original, newFileName, maxWidth, maxHeight);
  430. }
  431. /// <summary>
  432. /// 获取图片流
  433. /// </summary>
  434. /// <param name="url">图片URL</param>
  435. /// <returns></returns>
  436. private static Stream GetRemoteImage(string url)
  437. {
  438. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  439. request.Method = "GET";
  440. request.ContentLength = 0;
  441. request.Timeout = 20000;
  442. HttpWebResponse response = null;
  443. try
  444. {
  445. response = (HttpWebResponse)request.GetResponse();
  446. return response.GetResponseStream();
  447. }
  448. catch
  449. {
  450. return null;
  451. }
  452. }
  453. }
  454. }