ImageZip.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Drawing;
  5. using System.Drawing.Imaging;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace RailLocalMeter
  11. {
  12. public class ImageZip
  13. {
  14. #region 按比例压缩
  15. /// <summary>
  16. /// 将byte转换为图像
  17. /// </summary>
  18. /// <param name="Bytes"></param>
  19. /// <returns></returns>
  20. public static Bitmap BytesToBitmap(byte[] Bytes)
  21. {
  22. if (Bytes.Length == 0 || Bytes.Length == 1)
  23. {
  24. return null;
  25. }
  26. try
  27. {
  28. MemoryStream ImageMem = new MemoryStream(Bytes, true);
  29. ImageMem.Write(Bytes, 0, Bytes.Length);
  30. Bitmap _Image = new Bitmap(ImageMem);
  31. return _Image;
  32. }
  33. catch (Exception ex)
  34. {
  35. Debug.Print(ex.Message);
  36. return null;
  37. }
  38. }
  39. /// <summary>
  40. /// 图像保存转化为数组
  41. /// </summary>
  42. /// <param name="strFileName">传入图像文件名称</param>
  43. /// <returns></returns>
  44. public static byte[] ZipImageByte(string strImagePath)
  45. {
  46. try
  47. {
  48. long Dest_Size = 55296;
  49. Bitmap img = null;
  50. if (System.IO.File.Exists(strImagePath))
  51. {
  52. img = new Bitmap(strImagePath);
  53. }
  54. else
  55. {
  56. return new byte[1];
  57. }
  58. MemoryStream bmpStream = new MemoryStream();
  59. img.Save(bmpStream, System.Drawing.Imaging.ImageFormat.Jpeg);
  60. if (bmpStream.ToArray().Length < Dest_Size)
  61. {
  62. img.Dispose();
  63. return bmpStream.ToArray();
  64. }
  65. else
  66. {
  67. ImageFormat __format;
  68. System.Drawing.Imaging.Encoder __encoder;
  69. EncoderParameter __encoderParameter;
  70. EncoderParameters __encoderParameters;
  71. ImageCodecInfo __imageCodecInfo;
  72. __imageCodecInfo = DoGetEncoderInfo("image/jpeg");
  73. __encoder = System.Drawing.Imaging.Encoder.Quality;
  74. __encoderParameters = new EncoderParameters(1);
  75. long dLevel = 30L;
  76. long Len = Dest_Size;
  77. __encoderParameter = new EncoderParameter(__encoder, dLevel); //图片质量
  78. __encoderParameters.Param[0] = __encoderParameter;
  79. bmpStream = new MemoryStream();
  80. img.Save(bmpStream, __imageCodecInfo, __encoderParameters);
  81. Len = bmpStream.ToArray().Length;
  82. img.Dispose();
  83. return bmpStream.ToArray();
  84. }
  85. }
  86. catch (Exception exp)
  87. {
  88. Debug.Print(exp.Message);
  89. return new byte[1];
  90. }
  91. }
  92. /// <summary>
  93. /// 获取图片文件的编码与解码
  94. /// </summary>
  95. /// <param name="MYmimeType"></param>
  96. /// <returns></returns>
  97. public static ImageCodecInfo DoGetEncoderInfo(string MYmimeType)
  98. {
  99. int i = 0;
  100. System.Drawing.Imaging.ImageCodecInfo[] encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
  101. for (i = 0; i < encoders.Length; i++)
  102. {
  103. if (encoders[i].MimeType == MYmimeType)
  104. {
  105. return encoders[i];
  106. }
  107. }
  108. return null;
  109. }
  110. /// <summary>
  111. /// 图片压缩
  112. /// </summary>
  113. /// <param name="imagePath">图片文件路径</param>
  114. /// <param name="targetFolder">保存位置</param>
  115. /// <param name="quality">压缩质量</param>
  116. /// <param name="fileSuffix">压缩后的文件名后缀(防止直接覆盖原文件)</param>
  117. public static void CompressionImage(Image img, string targetFolder, long quality = 100, string fileSuffix = "compress")
  118. {
  119. var fileFullName = targetFolder;
  120. var imageByte = CompressionImage(img, quality);
  121. var ms = new MemoryStream(imageByte);
  122. var image = Image.FromStream(ms);
  123. image.Save(fileFullName);
  124. ms.Close();
  125. ms.Dispose();
  126. image.Dispose();
  127. }
  128. private static byte[] CompressionImage(Image img, long quality)
  129. {
  130. using (var bitmap = new Bitmap(img))
  131. {
  132. var codecInfo = GetEncoder(img.RawFormat);
  133. var myEncoder = System.Drawing.Imaging.Encoder.Quality;
  134. var myEncoderParameters = new EncoderParameters(1);
  135. var myEncoderParameter = new EncoderParameter(myEncoder, quality);
  136. myEncoderParameters.Param[0] = myEncoderParameter;
  137. using (var ms = new MemoryStream())
  138. {
  139. bitmap.Save(ms, codecInfo, myEncoderParameters);
  140. myEncoderParameters.Dispose();
  141. myEncoderParameter.Dispose();
  142. return ms.ToArray();
  143. }
  144. }
  145. }
  146. private static ImageCodecInfo GetEncoder(ImageFormat format)
  147. {
  148. var codecs = ImageCodecInfo.GetImageDecoders();
  149. return codecs.FirstOrDefault(codec => codec.FormatID == format.Guid);
  150. }
  151. #endregion
  152. }
  153. }