C#針對System.Drawing.Bitmap壓縮的實現
更新時間:2025年07月04日 11:11:55 作者:wangnaisheng
C#中System.Drawing.Bitmap壓縮可通過調整尺寸和JPEG質量實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
在 C# 中,System.Drawing.Bitmap 是表示圖像的核心類之一。如果想要對 Bitmap 對象進行壓縮,通常是指將其保存為文件時使用較低的圖像質量(例如 JPEG 格式),或者調整其尺寸以減少內存占用或文件大小。
一、使用Image.Save方法并設置壓縮參數(推薦)
將 Bitmap 保存為 JPEG 并設置壓縮質量
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);
// 設置壓縮質量
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); // 壓縮質量設為70%
bmp.Dispose();二、調整圖像尺寸進行“體積”壓縮
如果希望進一步減小圖像大小,可以先調整圖像的寬高,然后可以結合上面的方法,把縮小后的圖像再進行壓縮保存:
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 轉為字節(jié)數組(用于網絡傳輸等)
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();
}
}注意事項:
- 格式支持:只有某些圖像格式(如 JPEG)支持質量壓縮,PNG 是無損壓縮格式,不支持。
- 資源釋放:記得調用
.Dispose()來釋放Bitmap和Graphics等資源。 - 性能優(yōu)化:頻繁操作圖像時建議使用
unsafe或LockBits提高性能,但復雜度會增加。 - 跨平臺兼容性:
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 }); // 壓縮質量到此這篇關于C#針對System.Drawing.Bitmap壓縮的實現的文章就介紹到這了,更多相關C# System.Drawing.Bitmap壓縮內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#使用iTextSharp設置PDF所有頁面背景圖功能實例
這篇文章主要介紹了C#使用iTextSharp設置PDF所有頁面背景圖功能,實例分析了C#使用iTextSharp設置PDF頁面背景圖的實現方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
解析C#設計模式編程中外觀模式Facade Pattern的應用
這篇文章主要介紹了C#設計模式編程中外觀模式Facade Pattern的應用,外觀模式中分為門面(Facade)和子系統(tǒng)(subsystem)兩個角色來進行實現,需要的朋友可以參考下2016-02-02
C# string轉換為幾種不同編碼的Byte[]的問題解讀
這篇文章主要介紹了C# string轉換為幾種不同編碼的Byte[]的問題解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02

