2012-02-24 22 views
1

jpegイメージを含むバイト配列を持っています。サイズを減らすことが可能かどうか疑問に思っていましたか?イメージのサイズを小さくすることは可能ですかバイト配列

編集:[OK]をクリックします。私は間違いを認めた。それから私の質問は、私はバイト配列から来る画像の品質を減らすことができますです。

+3

どういう意味ですか?配列は、一度作成されると固定サイズになりますが、イメージ圧縮について話していますか?品質を低下させる?画像サイズを小さくするには?どうか明らかにしてください。 –

+0

ピザのようにスライスして食べる。申し訳ありませんが、バイト配列は私にピザを思い出させます。特に循環バッファ – mauris

答えて

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が画質にどのように影響するかを見ることができる例を示します。 jpegQualityの値として20,50、および80を使用して圧縮された同じ写真です。サイズは4.99,8.28、および12.9 KBです。

JPEG quality sample image

テキストは品質が高い場合であっても「汚れ」状態になるかに注意してください。このため、一様に色付けされた画像(コンピュータ上に作成された画像/図表/グラフ)を持つ画像にはJPEGを使用しないでください。代わりにPNGを使用してください。写真のJPEGは、品質をあまり低下させないと非常に適しています。

+0

GDI +で一般的なエラーが発生しました。 : この行: 'Image.Save(メモリストリーム、jpegEncoder、encoderParameters); ' –

+0

@MehmetBudak:申し訳ありません、コードを修正しました(' Image'クラスは「遅延」し、できるだけ後で画像バイトにアクセスします以前は入力バッファをあまりにも早く処分しました。) –

+1

あなたは私の国のヒーローになったばかりです!ありがとうございました!!!!) –

0

バイト配列のサイズは常に小さくすることができますが、イメージに関するデータは失われます。 jpegの品質を落とすと、バイト配列としてのデータ量が少なくなります。

0

JPEGバイトは、はるかに大きなバイト数の非常に圧縮された表現であると考えてください。 バイト数を減らすためにいくつかの関数を適用しようとすると、既に圧縮されたものを圧縮しようとするようなものになります。

関連する問題