2012-02-24 47 views
1

我有一個包含jpeg圖像的字節數組。我只是想知道是否可以減小它的尺寸?是否有可能減小來自字節數組的圖像的大小

編輯:好的。我承認我的錯誤。那麼我的問題是如何降低來自字節數組的圖像質量。

+3

你是什麼意思?數組一旦創建就有固定的大小,但您是否在談論圖像壓縮?降低質量?減少圖像大小?請澄清。 – 2012-02-24 13:26:57

+0

把它像披薩一樣切片並吃掉。抱歉的字節數組讓我想起比薩餅。尤其是循環緩衝區 – mauris 2012-02-24 13:28:14

回答

10

請理解,沒有免費的午餐。通過增加壓縮來減小JPEG圖像的大小也會降低圖像的質量。但是,也就是說,您可以使用Image類來減小JPEG圖像的大小。此代碼假定inputBytes包含原始圖像。

var jpegQuality = 50; 
Image image; 
using (var inputStream = new MemoryStream(inputBytes)) { 
    image = Image.FromStream(inputStream); 
    var jpegEncoder = ImageCodecInfo.GetImageDecoders() 
    .First(c => c.FormatID == ImageFormat.Jpeg.Guid); 
    var encoderParameters = new EncoderParameters(1); 
    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, jpegQuality); 
    Byte[] outputBytes; 
    using (var outputStream = new MemoryStream()) { 
    image.Save(outputStream, jpegEncoder, encoderParameters); 
    outputBytes = outputStream.ToArray(); 
    } 
} 

現在outputBytes包含使用不同JPEG質量的圖像的再壓縮版本。

通過減少jpegQuality(應該在0-100範圍內),您可以增加壓縮但降低圖像質量。有關更多信息,請參閱Encoder.Quality字段。

下面是一個例子,您可以看到jpegQuality如何影響圖像質量。這是使用20,50和80作爲jpegQuality的值壓縮的相同照片。尺寸是4.99,8.28和12.9 KB。

JPEG quality sample image

注意如何文本變得「污跡」,即使質量高。這就是爲什麼您應該避免對具有統一顏色區域的圖像(計算機上創建的圖像/圖表/圖表)使用JPEG。改用PNG。對於照片,如果不降低質量,JPEG非常適合。

+0

GDI +中發生了一般性錯誤。 :( 在這一行:'image.Save(memoryStream,jpegEncoder,encoderParameters);' – 2012-02-24 15:30:58

+0

@MehmetBudak:對不起,修正了代碼('Image'類是「lazy」,儘可能晚地訪問圖像字節以前,我把輸入緩衝區過早地處理了。) – 2012-02-24 15:50:08

+1

你剛剛成爲我的國家的英雄!謝謝先生!!!;) – 2012-02-24 16:35:14

0

字節數組的大小總是可以減小,但是會丟失有關圖像的數據。您可以降低jpeg的質量,然後將字節數組佔用更少的數據。

0

將JPEG字節看作是大量字節的壓縮表示。 所以如果你嘗試應用一些函數來減少字節數就好像試圖壓縮已經壓縮的東西。