C#針對(duì)System.Drawing.Bitmap壓縮的實(shí)現(xiàn)
在 C# 中,System.Drawing.Bitmap
是表示圖像的核心類(lèi)之一。如果想要對(duì) Bitmap
對(duì)象進(jìn)行壓縮,通常是指將其保存為文件時(shí)使用較低的圖像質(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 是無(wú)損壓縮格式,不支持。
- 資源釋放:記得調(diào)用
.Dispose()
來(lái)釋放Bitmap
和Graphics
等資源。 - 性能優(yōu)化:頻繁操作圖像時(shí)建議使用
unsafe
或LockBits
提高性能,但復(fù)雜度會(huì)增加。 - 跨平臺(tái)兼容性:
System.Drawing.Common
在 .NET Core/.NET 5+ 中不再支持非 Windows 平臺(tái)。如果需要跨平臺(tái),請(qǐng)考慮使用 ImageSharp。
替代方案:使用 ImageSharp(跨平臺(tái)推薦)
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#針對(duì)System.Drawing.Bitmap壓縮的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# System.Drawing.Bitmap壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#中通過(guò)委托來(lái)實(shí)現(xiàn)回調(diào)函數(shù)功能的方法
這篇文章主要介紹了C#中通過(guò)委托來(lái)實(shí)現(xiàn)回調(diào)函數(shù)功能的方法,文中舉了一個(gè)典型的多線程回調(diào)程序?qū)嵗?需要的朋友可以參考下2016-04-04實(shí)例分享C#中Explicit和Implicit用法
本篇文章主要給讀者們分享了C#中Explicit和Implicit的用法,對(duì)此有需求和興趣的朋友們一起學(xué)習(xí)下吧。2017-12-12C#使用csvhelper實(shí)現(xiàn)csv的基本操作
CsvHelper 是一個(gè)用于讀寫(xiě) CSV 文件的.NET庫(kù),極其快速,靈活且易于使用,CsvHelper 建立在.NET Standard 2.0 之上,幾乎可以在任何地方運(yùn)行,本文給大家介紹了C#使用csvhelper實(shí)現(xiàn)csv的基本操作,需要的朋友可以參考下2024-07-07深入講解C#編程中嵌套類(lèi)型和匿名類(lèi)型的定義與使用
這篇文章主要介紹了C#編程中嵌套類(lèi)型和匿名類(lèi)型的定義與使用,包括在SQL語(yǔ)句中使用匿名類(lèi)型的方法,需要的朋友可以參考下2016-01-01C#實(shí)現(xiàn)在匿名方法中捕獲外部變量的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在匿名方法中捕獲外部變量的方法,本文直接給出代碼實(shí)例,然后分析了代碼中的一些知識(shí)點(diǎn),需要的朋友可以參考下2015-03-03C#如何將查詢(xún)到的數(shù)據(jù)庫(kù)里面的數(shù)據(jù)輸出到textbox控件
這篇文章主要介紹了C#如何將查詢(xún)到的數(shù)據(jù)庫(kù)里面的數(shù)據(jù)輸出到textbox控件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07