• C#图片处理如何生成缩略图


    缩略图通常是将图片内容进行一定的缩小展现,或裁剪展现,主要有两个目的,一是提供一定的预览功能,二是节省屏幕展示空间、节省流量。
    在网站中我们通常运用在商品的列表,比如商城、图书、新闻等等列表的图片。在C#中我们如何生成缩略图呢,也就是缩小图片,下面我们来看一看如何缩小图片。

    其中方法参数如下:
    originalImagePath:源图路径(物理路径)
    thumbnailPath:缩略图路径(物理路径)
    width:生成缩略图宽度
    height:生成缩略图高度
    mode:生成缩略图的模式

    代码如下

    1. public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, ThumbnailMode mode)
    2. {
    3. System.Drawing.Image img_OriginalImage = null;
    4. ImageFormat tFormat = null;
    5. try
    6. {
    7. img_OriginalImage = (Bitmap)System.Drawing.Image.FromFile(originalImagePath);
    8. tFormat = img_OriginalImage.RawFormat;
    9. }
    10. catch (Exception ex)
    11. {
    12. if (img_OriginalImage != null)
    13. {
    14. img_OriginalImage.Dispose();
    15. }
    16. throw new Exception("压缩图片:" + originalImagePath + "失败!\r\n" + ex.Message);
    17. }
    18. int i_ToWidth = width;
    19. int i_ToHeight = height;
    20. int x = 0;
    21. int y = 0;
    22. int i_OriginalWidth = img_OriginalImage.Width;
    23. int i_OriginalHeight = img_OriginalImage.Height;
    24. switch (mode)
    25. {
    26. case ThumbnailMode.Width:
    27. i_ToHeight = img_OriginalImage.Height * width / img_OriginalImage.Width;
    28. break;
    29. case ThumbnailMode.Height:
    30. i_ToWidth = img_OriginalImage.Width * height / img_OriginalImage.Height;
    31. break;
    32. case ThumbnailMode.Cut:
    33. if ((double)img_OriginalImage.Width / (double)img_OriginalImage.Height > (double)i_ToWidth / (double)i_ToHeight)
    34. {
    35. i_OriginalHeight = img_OriginalImage.Height;
    36. i_OriginalWidth = img_OriginalImage.Height * i_ToWidth / i_ToHeight;
    37. y = 0;
    38. x = (img_OriginalImage.Width - i_OriginalWidth) / 2;
    39. }
    40. else
    41. {
    42. i_OriginalWidth = img_OriginalImage.Width;
    43. i_OriginalHeight = img_OriginalImage.Width * height / i_ToWidth;
    44. x = 0;
    45. y = (img_OriginalImage.Height - i_OriginalHeight) / 2;
    46. }
    47. break;
    48. default:
    49. break;
    50. }
    51. //新建一个BMP图片
    52. System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight);
    53. //新建一个画板
    54. System.Drawing.Graphics gp = Graphics.FromImage(img_BitMap);
    55. //设置高质量插值法
    56. gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    57. //设置高质量、低速度呈现平滑程度
    58. gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    59. gp.CompositingQuality = CompositingQuality.HighQuality;
    60. //清空画布并以透明背景色填充
    61. gp.Clear(Color.Transparent);
    62. //指定位置并按大小绘制原图片的指定部分
    63. gp.DrawImage(img_OriginalImage, new Rectangle(0, 0, i_ToWidth, i_ToHeight), new Rectangle(x, y, i_OriginalWidth, i_OriginalHeight), GraphicsUnit.Pixel);
    64. try
    65. {
    66. EncoderParameters ep = new EncoderParameters();
    67. long[] qy = new long[1];
    68. qy[0] = 100;//设置压缩的比例1-100
    69. EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
    70. ep.Param[0] = eParam;
    71. ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
    72. ImageCodecInfo jpegICIinfo = null;
    73. for (int i = 0; i < arrayICI.Length; i++)
    74. {
    75. if (arrayICI[i].FormatDescription.Equals("JPEG"))
    76. {
    77. jpegICIinfo = arrayICI[i];
    78. break;
    79. }
    80. }
    81. if (jpegICIinfo != null && Equals(tFormat, ImageFormat.Jpeg))
    82. {
    83. //以JPG格式保存图片
    84. img_BitMap.Save(thumbnailPath, jpegICIinfo, ep);
    85. //Const.iSuccessCount++;
    86. }
    87. else
    88. {
    89. img_BitMap.Save(thumbnailPath, tFormat);
    90. //Const.iSuccessCount++;
    91. }
    92. }
    93. catch (Exception ex)
    94. {
    95. Console.WriteLine("复制图片:" + originalImagePath + "失败!\r\n" + ex.Message + ex.StackTrace);
    96. }
    97. finally
    98. {
    99. if (img_OriginalImage != null)
    100. {
    101. img_OriginalImage.Dispose();
    102. }
    103. if (img_BitMap != null)
    104. {
    105. img_BitMap.Dispose();
    106. }
    107. if (gp != null)
    108. {
    109. gp.Dispose();
    110. }
    111. //GC.Collect();
    112. }
    113. }
    1. public enum ThumbnailMode
    2. {
    3. /// <summary>
    4. /// 指定宽度,高度按照比例缩放
    5. /// </summary>
    6. Width = 0,
    7. /// <summary>
    8. /// 指定高度,宽度按照比例缩放
    9. /// </summary>
    10. Height = 1,
    11. /// <summary>
    12. /// 按照指定的高度和宽度剪裁
    13. /// </summary>
    14. Cut = 2,
    15. /// <summary>
    16. /// 指定宽度,高度按照比例缩放
    17. /// </summary>
    18. None = 3
    19. }
    • 在该方法中我们首先使用(Bitmap)System.Drawing.Image.FromFile将文件加载到bitmap。
    • 根据mode传入的压缩模式进行原始绘图区域的计算。
    • 将计算出的区域绘制到新的BitMap。
    • 将绘制的BitMap图片保存到指定文件。

    通过如上的几步就完成了缩略图的生成。

  • 相关阅读:
    如何处理CAN通讯故障
    LeetCode刷题系列 -- 1020. 飞地的数量
    婴儿沐浴座椅上架亚马逊美国站安全标准要求ASTM F1967-19测试,CPC认证
    GNU C中({})表达式的返回值
    linux centos 下nginx版本升级
    如何在 FastReport VCL 中通过 Outlook 发送和接收报告?
    C++中或运算符(||)执行的逻辑及顺序
    SpringBoot - 集成Actuator(应用信息显示、修改系统日志、增加账号密码登录)
    [每周一更]-(第63期):Linux-nsenter命令使用说明
    res_company_white_url.py 详解
  • 原文地址:https://blog.csdn.net/lwf3115841/article/details/128155854