我完全停留在图像大小调整上,因为我使用典型的图像大小调整示例来获取OutOfMemoryException
,这些示例可以在许多以OOM为特色的问题上找到。
我甚至尝试过可以在Nuget上找到的DynamicImage,这也引发了OutOfMemoryException
。
任何人都可以告诉我如何在不将其加载到内存中的情况下降低C#中图像的质量/尺寸?
编辑:我想要c#equivalent,如果有的话?
编辑:我放弃了典型的调整大小的方法,因为我无法避免在我的实时网站上运行旧服务器上的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大小而不将图像加载到内存中,但任何可以帮助我的其他想法都将受到赞赏。
答案 0 :(得分:1)
您可以尝试通过ImageMagick或command line使用.NET bindings。 ImageMagick在读取文件时调整大小some options,这样可以减少内存消耗。
答案 1 :(得分:0)
您使用的“图像”可能不是受支持的格式或已损坏。
答案 2 :(得分:0)
我没有提到我继承了未正确处理图像的遗留代码,因为我认为修复它并不重要。奇怪的是,在重新启动网站和AppPool后,我能够再次上传图片而无需获得OutOfMemoryExcepiton。我很难理解为什么会发生这种情况,因为我已经更改了代码以正确处理图像并且已经完成了几次部署,所以我希望能够从内存中清除任何未曝光的图像?图片大小调整和上传的所有代码都在静态类中,我相信GC.collect()不适用于静态变量?
我的理论是,即使我重新聚合到网站,这些不可分割的图像已经在内存中建立并保持不变,因为这是我重新启动应用程序池后代码重新开始工作的唯一结论。
我会删除我的问题,但现在已经回答了,如果有人可以帮助解释这里发生的事情,我很乐意重新分配答案。