非常に大きな画像 (jpg) があり、csharp プログラムを作成してファイルをループし、各画像のサイズを 75% 縮小したいと考えています。
私はこれを試しました:
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
しかし、ファイルサイズはまだ非常に大きいです。
とにかくサムネイルを作成してファイルサイズを小さくする方法はありますか?
非常に大きな画像 (jpg) があり、csharp プログラムを作成してファイルをループし、各画像のサイズを 75% 縮小したいと考えています。
私はこれを試しました:
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
しかし、ファイルサイズはまだ非常に大きいです。
とにかくサムネイルを作成してファイルサイズを小さくする方法はありますか?
private void CompressAndSaveImage(Image img, string fileName,
long quality) {
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
img.Save(fileName, GetCodecInfo("image/jpeg"), parameters);
}
private static ImageCodecInfo GetCodecInfo(string mimeType) {
foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders())
if (encoder.MimeType == mimeType)
return encoder;
throw new ArgumentOutOfRangeException(
string.Format("'{0}' not supported", mimeType));
}
使用法:
Image myImg = Image.FromFile(@"C:\Test.jpg");
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10);
これにより、Test.jpg が品質 10 で圧縮され、Test2.jpg として保存されます。
編集:拡張メソッドとしてより良いかもしれません:
private static void SaveCompressed(this Image img, string fileName,
long quality) {
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
img.Save(fileName, GetCodecInfo("image/jpeg"), parameters);
}
使用法:
Image myImg = Image.FromFile(@"C:\Test.jpg");
myImg.SaveCompressed(@"C:\Test2.jpg", 10);
ImageMagickは、画像操作を行うための非常に強力なコマンド ライン ツールです。ソース画像の縦横比が不明または信頼できない状況で、大きな画像のサイズ変更とサムネイルの作成に使用しました。ImageMagick は、画像の元の縦横比を維持しながら、特定の高さまたは幅に画像のサイズを変更できます。必要に応じて、画像の周囲にスペースを追加することもできます。全体として、非常に強力で、.nets Image API を処理しなければならないことからの優れた抽象化です。C# 内から imageMagick コマンド ライン ツールを使用するには、次のように System.Diagnostics.ProcessStartInfo オブジェクトを使用することをお勧めします。
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation);
Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
scale% パラメータを使用すると、画像のサイズを簡単に 75% 縮小できます。
画像を圧縮します。サムネイルについては、品質を求めていないため、JPEG で十分です。
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
thumbNail.Save(fileName, ImageFormat.Jpeg);
GetThumbnailImage
のドキュメントから:
Image に埋め込まれたサムネイル画像が含まれている場合、このメソッドは埋め込まれたサムネイルを取得し、要求されたサイズにスケーリングします。Image にサムネイル画像が埋め込まれていない場合、このメソッドはメイン画像をスケーリングしてサムネイル画像を作成します。
幅と高さの値を小さくすることをお勧めします。試す:
// reduce the size of each image by 75% from original 800x600
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero);
サンプルコードを参照してください。
次のドキュメントもお読みください。
GetThumbnailImage メソッドは、要求されたサムネイル イメージのサイズが約 120 x 120 ピクセルの場合に適切に機能します。サムネイルが埋め込まれた画像から大きなサムネイル画像 (300 x 300 など) を要求すると、サムネイル画像の品質が著しく低下する可能性があります。DrawImage メソッドを呼び出して、(埋め込まれたサムネイルをスケーリングするのではなく) メイン イメージをスケーリングする方がよい場合があります。
スケーリング API を見てみたいと思うかもしれません。