網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
縮略圖通常是將圖片內(nèi)容進(jìn)行一定的縮小展現(xiàn),或裁剪展現(xiàn),主要有兩個(gè)目的,一是提供一定的預(yù)覽功能,二是節(jié)省屏幕展示空間、節(jié)省流量。
在網(wǎng)站中我們通常運(yùn)用在商品的列表,比如商城、圖書(shū)、新聞等等列表的圖片。在C#中我們?nèi)绾紊煽s略圖呢,也就是縮小圖片,下面我們來(lái)看一看如何縮小圖片。
其中方法參數(shù)如下:
- 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;
}
//新建一個(gè)BMP圖片
System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight);
//新建一個(gè)畫(huà)板
System.Drawing.Graphics gp = Graphics.FromImage(img_BitMap);
//設(shè)置高質(zhì)量插值法
gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//設(shè)置高質(zhì)量、低速度呈現(xiàn)平滑程度
gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gp.CompositingQuality = CompositingQuality.HighQuality;
//清空畫(huà)布并以透明背景色填充
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;//設(shè)置壓縮的比例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("復(fù)制圖片:" + 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。
根據(jù)mode傳入的壓縮模式進(jìn)行原始繪圖區(qū)域的計(jì)算。
將計(jì)算出的區(qū)域繪制到新的BitMap。
將繪制的BitMap圖片保存到指定文件。
通過(guò)如上的幾步就完成了縮略圖的生成。
原文鏈接:https://blog.csdn.net/lwf3115841/article/details/128155854
相關(guān)推薦
- 2022-05-25 Python可變參數(shù)*args和**kwargs_python
- 2022-10-10 python正則表達(dá)式之re.match()與re.search()的用法及區(qū)別_python
- 2022-06-25 JQuery操作與遍歷元素并設(shè)置其屬性、樣式和內(nèi)容_jquery
- 2023-04-02 深入分析Golang?Server源碼實(shí)現(xiàn)過(guò)程_Golang
- 2022-02-26 網(wǎng)頁(yè)小圖標(biāo)和文字混排時(shí)如何對(duì)齊基準(zhǔn)線(xiàn)
- 2022-08-20 Redis+AOP+自定義注解實(shí)現(xiàn)限流_Redis
- 2022-08-29 Python可視化神器pyecharts繪制雷達(dá)圖_python
- 2022-07-01 事務(wù)在c#中的使用_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支