2017-12-27 18 views
0

ASP.NET Core 2でCoreCompatライブラリを使用して画像をjpegに圧縮したいと思います。異なる品質とファイルで画像を取得したい画像がありますサイズ。問題は、品質パラメータの値が異なると、同じファイルサイズになるということです。私は間違って何をしていますか?品質のために私はここに私のコードは値0、50と100を使用していました:CoreCompatで圧縮したときに画像のサイズが変わらない

const int size = 500; 
const long quality = 50L; 

string inputPath = @"D:\Images\land.jpg"; 
string outputPath = [email protected]"D:\Images\land_{quality}.jpg"; 

using (var image = new Bitmap(System.Drawing.Image.FromFile(inputPath))) 
{ 
    var resized = new Bitmap(size, size); 
    using (var graphics = Graphics.FromImage(resized)) 
    { 
     graphics.CompositingQuality = CompositingQuality.HighSpeed; 
     graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphics.CompositingMode = CompositingMode.SourceCopy; 
     graphics.DrawImage(image, 0, 0, size, size); 
     using (var output = File.Open(outputPath, FileMode.Create)) 
     { 
      var qualityParamId = Encoder.Quality; 
      var encoderParameters = new EncoderParameters(1); 
      encoderParameters.Param[0] = new EncoderParameter(qualityParamId, quality); 
      var codec = ImageCodecInfo.GetImageDecoders() 
       .FirstOrDefault(c => c.FormatID == ImageFormat.Jpeg.Guid); 
      resized.Save(output, codec, encoderParameters); 
     } 
    } 
} 

私の入力ファイルlang.jpgは、サイズ5メガバイト(8386x2229)と出力ファイルland_0.jpg、land_50.jpgとland_100.jpgを持っていますすべて62KB、ディメンション500x500です。なぜこれらの出力ファイルは同じサイズですか?

答えて

0

品質調整では、ファイルサイズが小さくなることは保証されません。圧縮がどの程度「損失を被るか」が決まります。しかし、最終的にピクセルはピクセルであり、そのピクセルとその色をエンコードするための1つ以上のバイトが必要です。ファイルサイズを減らす唯一の保証された方法は、解像度を下げることです。つまり、エンコードするピクセルが少なく、イメージを表すのに必要なバイト数が少なくなります。

イメージ圧縮は2通りの方法で動作します。第1に、画像を符号化するのに必要な全体のバイトを減らす試みがなされている。 GIFやPNGのような型では、これは色空間を制限することによって行われます。例えば、数百万の代わりに合計256色に画像を制限することにより、より多くのピクセルが同じ色を共有するため、特定の色の代わりにカラーインデックスに依存することができます。 JPEGのようなものの場合、これはきめ細かいディテールを減らすことによって実現されます。最終結果はほぼ同じです。より多くのピクセルが同じ色を共有し、より良い圧縮が可能になります。

圧縮の第2部分は、これらの共有ピクセル特性を使用してエンコードに必要な全体的なバイトを削減することによって実現されます。特定の色をエンコードするために各ピクセルにバイトを含める代わりに、単一の色をエンコードするだけで、このピクセルのセットがそれを使用することができます。これは、他の方法では個別にエンコードする必要のあるバイトを共有するためにプレースホルダを使用している点で、zip作業のようなアーカイブと同じです。

この点は圧縮率が変わり、圧縮される画像/データに100%依存していることです。イメージの場合、色や細かい細部がたくさんあると、品質を0にすることさえ実際にはあまり効果がないかもしれません。一部の画像情報は破棄されますが、最終結果が比較的重要でないことから始まる情報がたくさんあります。ここでも、品質設定に関係なく、500x500ピクセルは500x500ピクセルです。品質を下げると、より積極的な圧縮が可能になりますが、ソースによっては、積極的な圧縮でも多くのバイトを削除できない場合があります。

関連する問題