當我加載一個jpg文件並轉身並將其保存爲100的質量並且尺寸幾乎是原來的4倍時,我剛剛獲得了真正的驚喜。爲了進一步調查,我打開並保存,沒有明確設置質量和文件大小是完全一樣的。我想這是因爲沒有改變,所以它只是寫完全相同的位回到一個文件。爲了測試這個假設,我在對角線上繪製了一條大胖線,並且沒有設置質量再次保存(這次我預計文件會跳起來,因爲它會變髒),但是它減少了〜10Kb!Image.Save()用於jpeg文件的質量等級是什麼?
在這一點上我真的不明白當我簡單地調用Image.Save()w/out指定壓縮質量時發生了什麼。當質量設置爲100(基本上不壓縮)時,文件大小如何接近(在圖像修改後)原始大小,如果沒有設置質量,文件大小比原始大幾倍?
我已經閱讀了關於Image.Save()的文檔,並且缺少關於幕後發生的事情的任何細節。我已經搜索了每種我能想到的方式,但我找不到任何可以解釋我所看到的信息。我已經連續工作了31個小時,所以也許我錯過了一些明顯的東西; 0)
所有這些都是因爲我實現了一些庫方法來保存圖像到數據庫。我已經重載了我們的「SaveImage」方法來允許明確地設置一個質量,在我的測試過程中,我遇到了上面解釋的奇怪(對我)結果。任何你可以擺脫的燈將不勝感激。
下面是一些代碼,將說明什麼我遇到:
string filename = @"C:\temp\image testing\hh.jpg";
string destPath = @"C:\temp\image testing\";
using(Image image = Image.FromFile(filename))
{
ImageCodecInfo codecInfo = ImageUtils.GetEncoderInfo(ImageFormat.Jpeg);
// Set the quality
EncoderParameters parameters = new EncoderParameters(1);
// Quality: 10
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 10L);
image.Save(destPath + "10.jpg", codecInfo, parameters);
// Quality: 75
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 75L);
image.Save(destPath + "75.jpg", codecInfo, parameters);
// Quality: 100
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 100L);
image.Save(destPath + "100.jpg", codecInfo, parameters);
// default
image.Save(destPath + "default.jpg", ImageFormat.Jpeg);
// Big line across image
using (Graphics g = Graphics.FromImage(image))
{
using(Pen pen = new Pen(Color.Red, 50F))
{
g.DrawLine(pen, 0, 0, image.Width, image.Height);
}
}
image.Save(destPath + "big red line.jpg", ImageFormat.Jpeg);
}
public static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
return ImageCodecInfo.GetImageEncoders().ToList().Find(delegate(ImageCodecInfo codec)
{
return codec.FormatID == format.Guid;
});
}
我做了一些關於.NET中的JPG壓縮和相應錯誤的實驗,請參閱http://www.c4real.biz/jpgCompression.aspx。 – 2012-02-27 18:38:25
基於一些快速測試,看起來你的原始直覺是正確的:如果你有一個原本是jpg的圖像,並且在沒有指定質量的情況下調用Save,它只會將原始位轉儲到文件中。如果您修改了內存中的圖像,或者您請求了特定的壓縮級別,則會重新對圖像進行編碼。如果您對來自低質量源的圖像請求高質量級別,則會浪費大量空間,試圖非常準確地描述原始壓縮引入的所有工件。 – sethobrien 2012-11-12 17:18:28