2017-12-27 14 views
0

Ich möchte Bild zu JPEG mit CoreCompat-Bibliothek in ASP.NET Core 2 komprimieren. Es gibt Qualitätsparameter, die ich ändern möchte und Bilder mit verschiedenen Qualitäten und Datei erhalten Größen. Problem ist, dass ich bei verschiedenen Werten für Qualitätsparameter dieselbe Dateigröße bekomme. Was mache ich falsch? hatBildgröße ändert sich nicht mit anderer Qualität, wenn mit CoreCompat komprimiert

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); 
     } 
    } 
} 

Meine Eingabedatei lang.jpg Größe 5 MB (8386x2229) und Ausgabedateien land_0.jpg, land_50.jpg und land_100.jpg: Für Qualität Ich war Werte 0, 50 und 100. Hier ist mein Code alle haben 62KB und Abmessungen 500x500. Warum haben diese Ausgabedateien dieselbe Größe?

Antwort

0

Die Qualitätsanpassung garantiert keine kleineren Dateigrößen, sie bestimmt nur, wie "verlustbehaftet" die Komprimierung ist. Letztlich ist jedoch ein Pixel ein Pixel und es muss ein oder mehrere Bytes geben, um dieses Pixel und seine Farbe zu codieren. Die einzige Möglichkeit, die Dateigröße zu reduzieren, besteht darin, die Auflösung zu reduzieren, was bedeutet, dass weniger Pixel zu kodieren sind und somit weniger Bytes für die Darstellung des Bildes erforderlich sind.

Die Bildkomprimierung funktioniert auf zwei Arten. Zuerst wird ein Versuch unternommen, die Gesamtbytes zu reduzieren, die zum Codieren des Bildes benötigt werden. Bei Typen wie GIF und PNG wird dies durch Einschränkung des Farbraums erreicht. Wenn Sie beispielsweise das Bild auf insgesamt 256 Farben beschränken, statt auf potenziell Millionen, haben mehrere Pixel die gleiche Farbe und können sich daher auf den Farbindex anstelle einer bestimmten Farbe verlassen. Bei etwas wie einem JPEG wird dies durch Reduzieren der feinen Details erreicht. Das Endergebnis ist weitgehend das gleiche: Mehr Pixel teilen sich die gleichen Farben und ermöglichen eine bessere Komprimierung.

Der zweite Teil der Komprimierung wird erreicht, indem diese gemeinsamen Pixeleigenschaften verwendet werden, um die Gesamtanzahl der Bytes zu reduzieren, die für die Codierung benötigt werden. Anstatt dass jedes Pixel Bytes enthalten muss, um seine bestimmte Farbe zu kodieren, können Sie nur eine einzelne Farbe kodieren und sagen, dass diese Menge von Pixeln diese verwendet. Es ist die gleiche Art und Weise, wie Archive wie zip funktionieren, indem Platzhalter für die gemeinsame Nutzung von Bytes verwendet werden, die andernfalls einzeln codiert werden müssten.

Der Punkt von diesem ist, dass Kompressionsverhältnisse wildy variieren und 100% abhängig von dem Bild/den Daten sind, die komprimiert werden. Im Falle eines Bildes, wenn es viele Farben und/oder viele feine Details gibt, kann selbst das Reduzieren der Qualität auf 0 nicht viel erreichen. Einige Bildinformationen werden verworfen, aber es gibt so viele Informationen, dass das Endergebnis relativ unbedeutend ist. 500x500 Pixel sind 500x500 Pixel, unabhängig von der Qualitätseinstellung. Wenn Sie die Qualität verringern, können Sie eine aggressivere Komprimierung durchführen. Je nach Quelle kann jedoch selbst eine aggressive Komprimierung viele Bytes nicht entfernen.

Verwandte Themen