我完全坚持图像调整大小,因为我正在OutOfMemoryException
使用图像调整大小的典型示例,这些示例可以在具有 OOM 的许多问题中找到。
我什至尝试了可以在 Nuget 上找到的 DynamicImage,这也抛出了一个OutOfMemoryException
.
谁能告诉我如何降低 C# 中图像的质量/大小,而不将其加载到内存中?
编辑:我想要与此等效的 c# ,如果有的话?
编辑:我放弃了调整大小的典型方法,因为我无法避免在旧服务器上运行的实时站点上出现 OutOfMemoryExceptions。
进一步编辑:我的服务器的操作系统是 Microsoft Server 2003 标准版
我可以发布我的代码示例,但我正在尝试找到解决 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 异常,我想以某种方式减小 fize 大小而不将图像加载到内存中,但是任何可以帮助我的替代想法将不胜感激。