您好我正在尝试上传一些图像异步,我得到内存异常,我通过使用语句进行处理但是我得到了跟踪堆栈跟踪
in.close();
这是resizer,我得到例外:
[OutOfMemoryException: Out of memory.]
System.Drawing.Graphics.CheckErrorStatus(Int32 status) +1146420
System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback, IntPtr callbackData) +256
System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr) +48
这里上传图片:
public Bitmap ResizeImage(Image image, int width, int height)
{
var newWidth = (int)(imageWidth * ratio) < 210 ? 210 : (int)(imageWidth * ratio);
var newHeight = (int)(imageHeight * ratio) < 210 ? 210 : (int)(imageHeight * ratio);
//Image resize logic
var destRect = new Rectangle(0, 0, newWidth, newHeight);
var destImage = new Bitmap(newWidth, newHeight);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
/*Here I get error*/graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel,
wrapMode);
}
}
return destImage;
}
这是主要功能:
private async Task<short> UploadImage(string title, HttpPostedFileBase file, short dimensionWidth,
short dimensionHeight)
{
var blockBlob = CloudBlobContainer.GetBlockBlobReference(title);
var jpgInfo = ImageCodecInfo.GetImageEncoders().First(codecInfo => codecInfo.MimeType == "image/jpeg");
using (var image = Image.FromStream(file.InputStream, true, true))
{
using (var stream = new MemoryStream())
using (var encParams = new EncoderParameters(1))
{
encParams.Param[0] = new EncoderParameter(Encoder.Quality, 60L);
if (image.Width > dimensionWidth && image.Height > dimensionHeight)
using (Bitmap bitMapImage = ResizeImage(image, dimensionWidth, dimensionHeight))
{
bitMapImage.Save(stream, jpgInfo, encParams);
}
else
{
image.Save(stream, jpgInfo, encParams);
}
stream.Position = 0;
await blockBlob.UploadFromStreamAsync(stream);
blockBlob.Properties.CacheControl = "public, max-age=864000";
blockBlob.SetProperties();
}
}
return (short)EnumData.EOpStatus.Success;
}
因此,在上传一些内容后,我收到了错误
答案 0 :(得分:0)
我相信你确实想要在目标矩形之外绘画......如果你注意到你的代码,你实际上(在标记的行中)绘制image.Width
和image.Height
(原始尺寸),而不是比例应用的维度......
答案 1 :(得分:0)
在作业完成后处理sourceImage和destImage。