C# 压缩图片并保存到本地

news/2025/2/8 3:19:20/

本文主要介绍如何使用C#将图片进行压缩并保存到本地。

接收一个原始图片的字节数组、需要保存的图片类型、输出路径和图片质量。方法首先将字节数组转换为一个内存流,然后使用Image.FromStream方法将内存流转换为一个Image对象。接下来,方法创建一个编码参数对象,设置图片的质量。之后,通过调用GetImageCodecInfo方法获取指定图片类型对应的编码器信息。最后,调用image.Save方法将压缩后的图片保存到指定的输出路径。

/// <summary>
/// 压缩图片byte数组并保存到本地
/// </summary>
/// <param name="bytes">原始图片byte数组</param>
/// <param name="format">需要保存图片的MIME类型</param>
/// <param name="outputPath">输出路径</param>
/// <param name="quality">图片质量0-100</param>
private void CompressImage(byte[] bytes, ImageFormat format, string outputPath, long quality)
{using (MemoryStream ms = new MemoryStream(bytes)){Image image = Image.FromStream(ms);// 创建一个编码参数对象EncoderParameters encoderParams = new EncoderParameters(1);encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality); // 100表示最高质量(无损)var pngCodec = GetImageCodecInfo(format);// 保存压缩后的图片image.Save(outputPath, pngCodec, encoderParams);}
}

接收一个原始图片的路径、输出路径和图片质量。方法首先使用Image.FromFile方法加载原始图片。之后,创建一个编码参数对象,设置图片的质量。接下来,通过调用GetImageCodecInfo方法获取原始图片的类型对应的编码器信息。最后,调用image.Save方法将压缩后的图片保存到指定的输出路径。

/// <summary>
/// 压缩图片并保存到本地
/// </summary>
/// <param name="inputPath">原始图片路径</param>
/// <param name="outputPath">输出路径</param>
/// <param name="quality">图片质量0-100</param>
private void CompressImage(string inputPath, string outputPath, long quality)
{// 加载原始图片using (Image image = Image.FromFile(inputPath)){// 创建一个编码参数对象EncoderParameters encoderParams = new EncoderParameters(1);encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality); // 100表示最高质量(无损)var pngCodec = GetImageCodecInfo(image.RawFormat);// 保存压缩后的图片image.Save(outputPath, pngCodec, encoderParams);}
}

以下用于获取指定图片类型的编码器信息。方法首先调用ImageCodecInfo.GetImageEncoders()方法获取所有可用的编码器信息。然后,根据指定的图片类型匹配对应的编码器信息。如果指定的格式在已知的格式中不存在,返回默认的MIME类型。

/// <summary>
/// 设置图片扩展类型
/// </summary>
/// <param name="format">图片</param>
/// <returns></returns>
public ImageCodecInfo GetImageCodecInfo(ImageFormat format)
{ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();// 声明编码器ImageCodecInfo pngCodec;if (format.Equals(ImageFormat.Jpeg))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/jpeg");else if (format.Equals(ImageFormat.Png))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/png");else if (format.Equals(ImageFormat.Gif))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/gif");else if (format.Equals(ImageFormat.Bmp))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/bmp");else if (format.Equals(ImageFormat.Tiff))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/tiff");else if (format.Equals(ImageFormat.Icon))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/x-icon");else// 如果格式未知,返回默认的 MIME 类型pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "application/octet-stream");return pngCodec;
}

http://www.ppmy.cn/news/1570221.html

相关文章

深度学习篇---深度学习中的超参数张量转换模型训练

文章目录 前言第一部分&#xff1a;深度学习中的超参数1. 学习率&#xff08;Learning Rate&#xff09;定义重要性常见设置 2. 批处理大小&#xff08;Batch Size&#xff09;定义重要性常见设置 3. 迭代次数&#xff08;Number of Epochs&#xff09;定义重要性常见设置 4. 优…

FreeRTOS学习 --- 列表和列表项

列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构&#xff0c;概念上和链表有点类似&#xff0c;列表被用来跟踪 FreeRTOS中的任务。 列表项就是存放在列表中的项目 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表。 列表…

CEF132 编译指南 Windows 篇 - 安装 Git 和 Python (三)

1. 引言 在之前的文章里&#xff0c;我们成功地安装并配置了 Visual Studio 2022&#xff0c;为编译 CEF 132 做好了基础准备。接下来&#xff0c;我们需要安装 Git 和 Python 这两个至关重要的工具。它们在 CEF 132 的编译过程中扮演着不可或缺的角色&#xff1a;Git 用于获取…

【产品小白】什么是微服务

在数字化浪潮汹涌澎湃的当下&#xff0c;软件系统的规模持续扩张&#xff0c;复杂度呈指数级攀升。如何高效地开发软件&#xff0c;确保其后续的维护轻松便捷&#xff0c;同时具备强大的扩展能力&#xff0c;已然成为广大开发者待攻克的核心难题。微服务作为一种应运而生的前沿…

数据结构(Java)—— 优先级队列(堆)

1. 概念 优先级队列是一种抽象数据类型&#xff08;ADT&#xff09;&#xff0c;它允许队列中维护的元素按优先级排序&#xff0c;优先级最高的元素会优先被处理。 2. 使用 2.1 优先级队列的构造 构造器 功能介绍 PriorityQueue() 创建一个空的优先级队列&#xff0c;默认容量…

基于单片机的智能安全插座(论文+源码)

1 系统整体方案设计 本课题基于单片机的智能安全插座设计&#xff0c;以STM32嵌入式单片机为主体&#xff0c;将计算机技术和检测技术有机结合&#xff0c;设计一款电量参数采集装置&#xff0c;实现电压、电流信号的数据采集任务&#xff0c;电压、电流和功率在上位机的显示任…

中国通信企业协会 通信网络安全服务能力评定 风险评估二级要求准则

通信网络安全服务能力评定要求是对通信网络安全服务单位的资格状况、经济实力、技术能力、服务队伍、服务过程能力等方面的具体衡量和评价。中国通信企业协会通信网络安全服务能力评定风险评估二级应达到风险评估服务一级能力要求的所有条款&#xff0c;并在以下方面增强或增加…

MATLAB实现多种群遗传算法

多种群遗传算法&#xff08;MPGA, Multi-Population Genetic Algorithm&#xff09;是一种改进的遗传算法&#xff0c;它通过将种群分成多个子种群并在不同的子种群之间进行交叉和交换&#xff0c;旨在提高全局搜索能力并避免早期收敛。下面是多种群遗传算法的主要步骤和流程&a…