jpg ファイルを読み込んで振り返って 100 の品質で保存すると、サイズは元のほぼ 4 倍になりました。さらに調査するために、品質を明示的に設定せずに開いて保存しましたが、ファイルサイズはまったく同じでした。これは、何も変更されていないため、まったく同じビットをファイルに書き戻しているだけだと考えました。この仮定をテストするために、画像を斜めに横切る大きな太い線を描き、品質を設定せずに再度保存しました (今回は、ファイルが「汚れている」ため、ファイルが跳ね上がると予想していました) が、約 10Kb 減少しました!
この時点で、圧縮品質を指定せずに Image.Save() を呼び出すだけで何が起こっているのか本当にわかりません。品質を 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;
});
}