OutOfMemoryException
OOMを特徴とする多くの質問に見られる画像のサイズ変更の典型的な例を使用しているため、画像のサイズ変更に完全に固執しています。
Nuget にある DynamicImage も試してみましたが、これもOutOfMemoryException
.
メモリにロードせずに、C#で画像の品質/サイズを縮小する方法を誰か教えてもらえますか?
編集:もしあれば、これと同等のc#が欲しいですか?
編集:古いサーバーで実行されているライブサイトで OutOfMemoryExceptions を回避できないため、サイズ変更の一般的な方法をあきらめます。
さらに編集:私のサーバーのOSはMicrosoft Server 2003 Standard Editionです
コードの例を投稿できますが、OutOfMemoryExceptions を回避する方法を見つけようとしています。
public static void ResizeImage(string imagePath, int imageWidth, int imageHeight, bool upscaleImage) {
using (Image image = Image.FromFile(imagePath, false)) {
int width = image.Width;
int height = image.Height;
if (width > imageWidth || height > imageHeight || upscaleImage) {
image.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipX);
image.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipX);
float ratio = 0;
if (width > height) {
ratio = (float)width / (float)height;
width = imageWidth;
height = Convert.ToInt32(Math.Round((float)width / ratio));
}
else {
ratio = (float)height / (float)width;
height = imageHeight;
width = Convert.ToInt32(Math.Round((float)height / ratio));
}
using (Bitmap bitmap = new Bitmap(width, height)) {
bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (Graphics graphic = Graphics.FromImage(bitmap)) {
graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphic.DrawImage(image, 0, 0, width, height);
string extension = ".jpg"; // Path.GetExtension(originalFilePath);
using (EncoderParameters encoderParameters = new EncoderParameters(1)) {
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
using (MemoryStream imageMemoryStream = new MemoryStream()) {
bitmap.Save(imageMemoryStream, GetImageCodec(extension), encoderParameters);
using (Image result = Image.FromStream(imageMemoryStream, true, false)) {
string newFullPathName = //path;
result.Save(newFullPathName);
}
}
}
}
}
}
}
}
GetThumbnailImage が画質/サイズを下げることを望んでいたので、このコードも試しましたが、これも OOM 例外をスローしています:
viewModel.File.SaveAs(path);
Image image = Image.FromFile(path);
Image thumbnail = image.GetThumbnailImage(600, 600, null, new IntPtr());
image.Dispose();
File.Delete(path);
thumbnail.Save(path);
thumbnail.Dispose();
繰り返しますが、両方のコード例がローカル マシンで機能するため、コード内の障害/修正を見つけようとはしていません。OOM例外を回避するための解決策を探しています。画像をメモリにロードせずにサイズを縮小するという考えがありましたが、私を助けることができる代替のアイデアをいただければ幸いです。