サムネイルを作成し、画像サイズを縮小
-
22-08-2019 - |
質問
私は非常に大規模な画像(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);
これは10の品質にTest.jpgを圧縮し、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のには、イメージ操作を行うための非常に強力で、コマンドラインツールです。 Iは、ソース画像の縦横比が未知であるか、または信頼できない状況で、大きな画像やサムネイル作成のサイズを変更するためにそれを使用しました。 ImageMagickには、あなたの画像の元の縦横比を維持しながら、特定の高さまたは幅に画像のサイズを変更することが可能です。必要であれば、それはまた、画像の周囲にスペースを追加することができます。すべてのすべての非常に強力で、素敵な抽象化で.netsイメージの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();
あなたは簡単に75%によってあなたのイメージのサイズを小さくすることができ、スケールの%ののparamaterを使用して
あなたのイメージを圧縮します。あなたは品質を見ていないとして、サムネイルの場合、JPEGは、十分です。
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
thumbNail.Save(fileName, ImageFormat.Jpeg);
GetThumbnailImage
するのドキュメントから:
画像が埋め込まれたサムネイル画像が含まれている場合は、、この方法は、埋め込まれたサムネイルを取得し、要求されたサイズにスケーリングします。画像が埋め込まれたサムネイル画像が含まれていない場合、このメソッドは、メイン画像をスケーリングすることにより、サムネイル画像を作成します。
私はあなたが小さい幅と高さの値を使用することをお勧めしたいです。試してみてください。
// reduce the size of each image by 75% from original 800x600
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero);
サンプルのコードを参照してください。
また、ドキュメントを読んでます:
要求されたサムネイル画像は、約120×120画素のサイズを有している場合、GetThumbnailImage方法がうまく機能します。あなたが埋め込まれたサムネイルを持っているイメージからの(例えば、300×300)、大きなサムネイル画像を要求した場合、サムネイル画像における品質の顕著な損失があるかもしれません。 drawImageメソッドを呼び出して(代わりに埋め込まれたサムネイルをスケーリングする)主画像を縮小した方が良いかもしれない。
私はあなたがスケーリングAPIを見てみたいと思うことがあります。
この方法は非常によく助けてくれました。低い画像サイズは、
アスペクト比を維持します ShellFile shellFile = ShellFile.FromFilePath(ImageWithPath); //original image path
Bitmap shellThumbSmall = shellFile.Thumbnail.ExtraLargeBitmap; //change image size
shellThumbSmall.Save(ImageWithPathThumbnail, ImageFormat.Jpeg); // new image path and format
これらが必要とされている。
PM> Install-Package WindowsAPICodePack-Core
PM> Install-Package WindowsAPICodePack-Shell
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack;