網站首頁 編程語言 正文
縮略圖通常是將圖片內容進行一定的縮小展現,或裁剪展現,主要有兩個目的,一是提供一定的預覽功能,二是節省屏幕展示空間、節省流量。
在網站中我們通常運用在商品的列表,比如商城、圖書、新聞等等列表的圖片。在C#中我們如何生成縮略圖呢,也就是縮小圖片,下面我們來看一看如何縮小圖片。
其中方法參數如下:
- originalImagePath:源圖路徑(物理路徑)
- thumbnailPath:縮略圖路徑(物理路徑)
- width:生成縮略圖寬度
- height:生成縮略圖高度
- mode:生成縮略圖的模式
代碼如下
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, ThumbnailMode mode)
{
System.Drawing.Image img_OriginalImage = null;
ImageFormat tFormat = null;
try
{
img_OriginalImage = (Bitmap)System.Drawing.Image.FromFile(originalImagePath);
tFormat = img_OriginalImage.RawFormat;
}
catch (Exception ex)
{
if (img_OriginalImage != null)
{
img_OriginalImage.Dispose();
}
throw new Exception("壓縮圖片:" + originalImagePath + "失敗!\r\n" + ex.Message);
}
int i_ToWidth = width;
int i_ToHeight = height;
int x = 0;
int y = 0;
int i_OriginalWidth = img_OriginalImage.Width;
int i_OriginalHeight = img_OriginalImage.Height;
switch (mode)
{
case ThumbnailMode.Width:
i_ToHeight = img_OriginalImage.Height * width / img_OriginalImage.Width;
break;
case ThumbnailMode.Height:
i_ToWidth = img_OriginalImage.Width * height / img_OriginalImage.Height;
break;
case ThumbnailMode.Cut:
if ((double)img_OriginalImage.Width / (double)img_OriginalImage.Height > (double)i_ToWidth / (double)i_ToHeight)
{
i_OriginalHeight = img_OriginalImage.Height;
i_OriginalWidth = img_OriginalImage.Height * i_ToWidth / i_ToHeight;
y = 0;
x = (img_OriginalImage.Width - i_OriginalWidth) / 2;
}
else
{
i_OriginalWidth = img_OriginalImage.Width;
i_OriginalHeight = img_OriginalImage.Width * height / i_ToWidth;
x = 0;
y = (img_OriginalImage.Height - i_OriginalHeight) / 2;
}
break;
default:
break;
}
//新建一個BMP圖片
System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight);
//新建一個畫板
System.Drawing.Graphics gp = Graphics.FromImage(img_BitMap);
//設置高質量插值法
gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//設置高質量、低速度呈現平滑程度
gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gp.CompositingQuality = CompositingQuality.HighQuality;
//清空畫布并以透明背景色填充
gp.Clear(Color.Transparent);
//指定位置并按大小繪制原圖片的指定部分
gp.DrawImage(img_OriginalImage, new Rectangle(0, 0, i_ToWidth, i_ToHeight), new Rectangle(x, y, i_OriginalWidth, i_OriginalHeight), GraphicsUnit.Pixel);
try
{
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = 100;//設置壓縮的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int i = 0; i < arrayICI.Length; i++)
{
if (arrayICI[i].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[i];
break;
}
}
if (jpegICIinfo != null && Equals(tFormat, ImageFormat.Jpeg))
{
//以JPG格式保存圖片
img_BitMap.Save(thumbnailPath, jpegICIinfo, ep);
//Const.iSuccessCount++;
}
else
{
img_BitMap.Save(thumbnailPath, tFormat);
//Const.iSuccessCount++;
}
}
catch (Exception ex)
{
Console.WriteLine("復制圖片:" + originalImagePath + "失敗!\r\n" + ex.Message + ex.StackTrace);
}
finally
{
if (img_OriginalImage != null)
{
img_OriginalImage.Dispose();
}
if (img_BitMap != null)
{
img_BitMap.Dispose();
}
if (gp != null)
{
gp.Dispose();
}
//GC.Collect();
}
}
public enum ThumbnailMode
{
/// <summary>
/// 指定寬度,高度按照比例縮放
/// </summary>
Width = 0,
/// <summary>
/// 指定高度,寬度按照比例縮放
/// </summary>
Height = 1,
/// <summary>
/// 按照指定的高度和寬度剪裁
/// </summary>
Cut = 2,
/// <summary>
/// 指定寬度,高度按照比例縮放
/// </summary>
None = 3
}
在該方法中我們首先使用(Bitmap)System.Drawing.Image.FromFile將文件加載到bitmap。
根據mode傳入的壓縮模式進行原始繪圖區域的計算。
將計算出的區域繪制到新的BitMap。
將繪制的BitMap圖片保存到指定文件。
通過如上的幾步就完成了縮略圖的生成。
原文鏈接:https://blog.csdn.net/lwf3115841/article/details/128155854
相關推薦
- 2022-08-18 python數據可視化pygal模擬擲骰子實現示例_python
- 2022-11-06 Android?Navigation重建Fragment問題分析及解決_Android
- 2022-11-04 C#使用BinaryFormatter類、ISerializable接口、XmlSerializer
- 2022-08-03 在C++中把字符串轉換為整數的兩種簡單方法_C 語言
- 2022-06-28 python神經網絡Keras構建CNN網絡訓練_python
- 2022-06-10 SQL?Server使用導出向導功能_MsSql
- 2022-07-24 docker容器使用GPU方法實現_docker
- 2022-12-09 解讀opencv中cv2.imread()返回值為None問題及解決_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支