C#針對System.Drawing.Bitmap壓縮的實(shí)現(xiàn)
在 C# 中,System.Drawing.Bitmap 是表示圖像的核心類之一。如果想要對 Bitmap 對象進(jìn)行壓縮,通常是指將其保存為文件時使用較低的圖像質(zhì)量(例如 JPEG 格式),或者調(diào)整其尺寸以減少內(nèi)存占用或文件大小。
一、使用Image.Save方法并設(shè)置壓縮參數(shù)(推薦)
將 Bitmap 保存為 JPEG 并設(shè)置壓縮質(zhì)量
using System;
using System.Drawing;
using System.Drawing.Imaging;
public class ImageCompressor
{
public static void CompressAndSave(Bitmap bitmap, string outputPath, long quality = 80L)
{
// 指定編碼器為 JPEG
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// 設(shè)置壓縮質(zhì)量
Encoder qualityEncoder = Encoder.Quality;
EncoderParameters encoderParams = new EncoderParameters(1);
EncoderParameter qualityParam = new EncoderParameter(qualityEncoder, quality); // 0-100
encoderParams.Param[0] = qualityParam;
// 保存圖像
bitmap.Save(outputPath, jpgEncoder, encoderParams);
}
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
}使用示例:
Bitmap bmp = new Bitmap("input.png");
ImageCompressor.CompressAndSave(bmp, "output.jpg", 70L); // 壓縮質(zhì)量設(shè)為70%
bmp.Dispose();二、調(diào)整圖像尺寸進(jìn)行“體積”壓縮
如果希望進(jìn)一步減小圖像大小,可以先調(diào)整圖像的寬高,然后可以結(jié)合上面的方法,把縮小后的圖像再進(jìn)行壓縮保存:
public static Bitmap ResizeBitmap(Bitmap original, int newWidth, int newHeight)
{
Bitmap resized = new Bitmap(newWidth, newHeight);
using (Graphics g = Graphics.FromImage(resized))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(original, 0, 0, newWidth, newHeight);
}
return resized;
}三、將壓縮后的 Bitmap 轉(zhuǎn)為字節(jié)數(shù)組(用于網(wǎng)絡(luò)傳輸?shù)龋?/h2>
public static byte[] CompressBitmapToBytes(Bitmap bitmap, long quality = 80L)
{
using (var ms = new MemoryStream())
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
Encoder qualityEncoder = Encoder.Quality;
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(qualityEncoder, quality);
bitmap.Save(ms, jpgEncoder, encoderParams);
return ms.ToArray();
}
}
public static byte[] CompressBitmapToBytes(Bitmap bitmap, long quality = 80L)
{
using (var ms = new MemoryStream())
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
Encoder qualityEncoder = Encoder.Quality;
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(qualityEncoder, quality);
bitmap.Save(ms, jpgEncoder, encoderParams);
return ms.ToArray();
}
}注意事項(xiàng):
- 格式支持:只有某些圖像格式(如 JPEG)支持質(zhì)量壓縮,PNG 是無損壓縮格式,不支持。
- 資源釋放:記得調(diào)用
.Dispose()來釋放Bitmap和Graphics等資源。 - 性能優(yōu)化:頻繁操作圖像時建議使用
unsafe或LockBits提高性能,但復(fù)雜度會增加。 - 跨平臺兼容性:
System.Drawing.Common在 .NET Core/.NET 5+ 中不再支持非 Windows 平臺。如果需要跨平臺,請考慮使用 ImageSharp。
替代方案:使用 ImageSharp(跨平臺推薦)
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats.Jpeg;
var image = Image.Load("input.png");
image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2)); // 縮放
image.SaveAsJpeg("output.jpg", new JpegEncoder { Quality = 70 }); // 壓縮質(zhì)量到此這篇關(guān)于C#針對System.Drawing.Bitmap壓縮的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# System.Drawing.Bitmap壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#中通過委托來實(shí)現(xiàn)回調(diào)函數(shù)功能的方法
這篇文章主要介紹了C#中通過委托來實(shí)現(xiàn)回調(diào)函數(shù)功能的方法,文中舉了一個典型的多線程回調(diào)程序?qū)嵗?需要的朋友可以參考下2016-04-04
實(shí)例分享C#中Explicit和Implicit用法
本篇文章主要給讀者們分享了C#中Explicit和Implicit的用法,對此有需求和興趣的朋友們一起學(xué)習(xí)下吧。2017-12-12
C#使用csvhelper實(shí)現(xiàn)csv的基本操作
CsvHelper 是一個用于讀寫 CSV 文件的.NET庫,極其快速,靈活且易于使用,CsvHelper 建立在.NET Standard 2.0 之上,幾乎可以在任何地方運(yùn)行,本文給大家介紹了C#使用csvhelper實(shí)現(xiàn)csv的基本操作,需要的朋友可以參考下2024-07-07
C#實(shí)現(xiàn)在匿名方法中捕獲外部變量的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在匿名方法中捕獲外部變量的方法,本文直接給出代碼實(shí)例,然后分析了代碼中的一些知識點(diǎn),需要的朋友可以參考下2015-03-03
C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件
這篇文章主要介紹了C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

