C#針對System.Drawing.Bitmap壓縮的實現(xiàn)
在 C# 中,System.Drawing.Bitmap
是表示圖像的核心類之一。如果想要對 Bitmap
對象進行壓縮,通常是指將其保存為文件時使用較低的圖像質(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)整圖像尺寸進行“體積”壓縮
如果希望進一步減小圖像大小,可以先調(diào)整圖像的寬高,然后可以結(jié)合上面的方法,把縮小后的圖像再進行壓縮保存:
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(); } }
注意事項:
- 格式支持:只有某些圖像格式(如 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壓縮的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# System.Drawing.Bitmap壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#中通過委托來實現(xiàn)回調(diào)函數(shù)功能的方法
這篇文章主要介紹了C#中通過委托來實現(xiàn)回調(diào)函數(shù)功能的方法,文中舉了一個典型的多線程回調(diào)程序?qū)嵗?需要的朋友可以參考下2016-04-04C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件
這篇文章主要介紹了C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07