### C#无损压缩图片方法详解 在软件开发过程中,特别是在处理图像的场景下,对图片进行有效的压缩处理是一项常见的需求。本文将详细介绍一个利用C#实现的无损压缩图片的方法,该方法不仅可以帮助减少存储空间的需求,还能保持图片的质量不受损失。 #### 方法概述 在给出的代码片段中,我们可以看到一个名为`GetPicThumbnail`的静态方法,它接受多个参数,并返回一个布尔值。该方法的主要功能是对输入的图片进行缩放和质量调整,最终保存为指定格式的文件。下面我们将详细解析每个参数的意义以及整个方法的工作流程。 #### 参数解释 - **sFile**:原始图片的文件路径。 - **dFile**:压缩后的图片保存路径。 - **dHeight**:目标高度。 - **dWidth**:目标宽度。 - **flag**:压缩质量参数,取值范围为1-100。 #### 工作原理 1. **加载原始图片**:通过`System.Drawing.Image.FromFile(sFile)`加载原始图片到内存中。 2. **获取原始格式**:接着,使用`iSource.RawFormat`获取图片的原始格式。 3. **计算缩放尺寸**:根据目标宽度和高度,计算出合适的缩放比例,确保图片在缩放后既不会失真也不会超出指定的大小限制。 4. **创建缩略图**:利用`Bitmap`类创建一个新的空白位图,并设置其尺寸为`dWidth` x `dHeight`。 5. **绘制缩放后的图片**:使用`Graphics`类将原始图片按计算好的比例绘制到新的位图上。 6. **设置压缩参数**:创建`EncoderParameters`对象并设置压缩质量参数`flag`。 7. **选择编码器**:遍历所有的编码器,找到支持JPEG格式的`ImageCodecInfo`对象。 8. **保存图片**:将缩放和压缩后的图片保存到指定的位置。 #### 代码解析 1. **加载与格式获取**: ```csharp System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile); ImageFormat tFormat = iSource.RawFormat; ``` 2. **尺寸计算与缩放**: ```csharp int sW = 0, sH = 0; Size tem_size = new Size(iSource.Width, iSource.Height); if (tem_size.Width > dHeight || tem_size.Width > dWidth) { // 计算缩放比例 if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth)) { sW = dWidth; sH = (dWidth * tem_size.Height) / tem_size.Width; } else { sH = dHeight; sW = (tem_size.Width * dHeight) / tem_size.Height; } } else { sW = tem_size.Width; sH = tem_size.Height; } ``` 3. **创建新位图**: ```csharp Bitmap ob = new Bitmap(dWidth, dHeight); Graphics g = Graphics.FromImage(ob); g.Clear(Color.WhiteSmoke); ``` 4. **绘制图片**: ```csharp g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel); ``` 5. **保存图片**: ```csharp EncoderParameters ep = new EncoderParameters(); long[] qy = new long[1]; qy[0] = flag; EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy); ep.Param[0] = eParam; try { ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICIinfo = null; for (int x = 0; x < arrayICI.Length; x++) { if (arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICIinfo = arrayICI[x]; break; } } if (jpegICIinfo != null) { ob.Save(dFile, jpegICIinfo, ep); } else { ob.Save(dFile, tFormat); } return true; } catch { return false; } finally { iSource.Dispose(); ob.Dispose(); } ``` #### 总结 本篇文章详细介绍了如何使用C#来实现图片的无损压缩,通过对图片进行适当的缩放和质量调整,可以在不明显降低图片质量的前提下减小图片的体积。此方法适用于多种应用场景,如网站开发、移动应用开发等,尤其适合需要高效管理和优化大量图片资源的项目。希望本文能为读者提供一定的参考价值。
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![7z](https://img-home.csdnimg.cn/images/20241231044736.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![exe](https://img-home.csdnimg.cn/images/20241231044909.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![cs](https://img-home.csdnimg.cn/images/20250102104920.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
/// 无损压缩图片
/// </summary>
/// <param name="sFile">原图片</param>
/// <param name="dFile">压缩后保存位置</param>
/// <param name="dHeight">高度</param>
/// <param name="dWidth">宽度</param>
/// <param name="flag">压缩质量 1-100</param>
/// <returns></returns>
public static bool GetPicThumbnail(string sFile, string dFile, int dHeight, int dWidth, int flag)
{
System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
ImageFormat tFormat = iSource.RawFormat;
int sW = 0, sH = 0;
//按比例缩放
Size tem_size = new Size(iSource.Width, iSource.Height);
if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号
{
if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
{
sW = dWidth;
sH = (dWidth * tem_size.Height) / tem_size.Width;
}
else
{
sH = dHeight;
sW = (tem_size.Width * dHeight) / tem_size.Height;
}
}
else
sW = tem_size.Width;
sH = tem_size.Height;
}
Bitmap ob = new Bitmap(dWidth, dHeight);
Graphics g = Graphics.FromImage(ob);
g.Clear(Color.WhiteSmoke);
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
g.Dispose();
//以下代码为保存图片时,设置压缩质量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = flag;//设置压缩的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[x];
break;
}
}
剩余5页未读,继续阅读
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/e42f8276870f42b9a5a73c34791d4e37_qq_35600666.jpg!1)
- 粉丝: 1
- 资源: 10
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 基于单片机的视力保护器设计.zip
- 利用zigbee的无线单片机温度计课程设计2.zip
- 四轴飞行器-概念扫盲.zip
- 2218_144564123.html
- PictureCleaner图像漂白软件免费(内含效果图)
- 视频号无限制,AI一键生成原创视频项目玩法教程
- 冷门出行高峰来袭,里程积分项目玩法教程,高爆发期
- 电气安装工 三级工.pdf
- 整蛊无人直播项目玩法教程,支持抖音快手,利用矢重闪光
- 新起店项目玩法教程,拼多多虚拟电商,24小时实现成交
- 淘宝掘金项目玩法教程,单机操作收益
- arduino+android制作的智能家居系统(含源码、文档)
- 电气安装工 四级工.pdf
- Seetong监控软件Windows版
- 独家珍藏免费分享——智能家居控制系统完整设计方案(含设计方案、原理图、多功能面板、智能插座原理图、智能控制器等)
- 信用卡评分模型数据kaggle竞赛2019
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)