C#异步位图调整大小
我想做位图大小调整的异步任务。我想我会添加wait到Graphics.DrawImage或位图。保存,但我不能。这是我的密码: 控制器:C#异步位图调整大小,c#,asp.net,asynchronous,bitmap,C#,Asp.net,Asynchronous,Bitmap,我想做位图大小调整的异步任务。我想我会添加wait到Graphics.DrawImage或位图。保存,但我不能。这是我的密码: 控制器: //public async System.Threading.Tasks.Task<ActionResult> AddPicture(int? id, HttpPostedFileBase file) [HttpPost] public ActionResult AddPicture(int? id, HttpPosted
//public async System.Threading.Tasks.Task<ActionResult> AddPicture(int? id, HttpPostedFileBase file)
[HttpPost]
public ActionResult AddPicture(int? id, HttpPostedFileBase file)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
if (file != null && file.ContentLength > 0)
{
string extension = Path.GetExtension(file.FileName);
if (extension != ".jpg")
{
ModelState.AddModelError("jpg", "Error");
}
else
{
// file stream to byte[]
MemoryStream target = new MemoryStream();
file.InputStream.CopyTo(target);
byte[] TempByteArray = target.ToArray();
// byte[] to Bitmap
ImageConverter imageConverter = new ImageConverter();
Image TempImage = (Image)imageConverter.ConvertFrom(TempByteArray);
Bitmap FinalBitmap = new Bitmap(TempImage);
Bitmap Thumbnail = ResizeImage(FinalBitmap, 150, 150);
Bitmap FullPicture = ResizeImage(FinalBitmap, 800, 600);
var ThumbnailPath = Path.Combine(Server.MapPath("~/Content/Images/Thumbnails/"), product.ProductCode + ".jpg");
Thumbnail.Save(ThumbnailPath, ImageFormat.Jpeg);
var FullPicturePath = Path.Combine(Server.MapPath("~/Content/Images/"), product.ProductCode + ".jpg");
FullPicture.Save(FullPicturePath, ImageFormat.Jpeg);
}
}
else
{
ModelState.AddModelError("missingfile", "Error");
}
return View(product);
}
//public async System.Threading.Tasks.Task AddPicture(int?id,HttpPostedFileBase文件)
[HttpPost]
public ActionResult AddPicture(int?id,HttpPostedFileBase文件)
{
if(id==null)
{
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product Product=db.Products.Find(id);
如果(产品==null)
{
返回HttpNotFound();
}
如果(file!=null&&file.ContentLength>0)
{
字符串扩展名=Path.GetExtension(file.FileName);
如果(扩展名!=“.jpg”)
{
AddModelError(“jpg”,“Error”);
}
其他的
{
//文件流到字节[]
MemoryStream target=新的MemoryStream();
file.InputStream.CopyTo(目标);
字节[]TempByteArray=target.ToArray();
//字节[]到位图
ImageConverter ImageConverter=新的ImageConverter();
Image TempImage=(Image)imageConverter.ConvertFrom(TempByteArray);
位图FinalBitmap=新位图(TempImage);
位图缩略图=大小图像(最终位图,150,150);
位图FullPicture=大小图像(最终位图,800600);
var ThumbnailPath=Path.Combine(Server.MapPath(“~/Content/Images/Thumbnails/”),product.ProductCode+“.jpg”);
保存(ThumbnailPath,ImageFormat.Jpeg);
var FullPicturePath=Path.Combine(Server.MapPath(“~/Content/Images/”),product.ProductCode+.jpg”);
保存(FullPicturePath,ImageFormat.Jpeg);
}
}
其他的
{
AddModelError(“missingfile”,“Error”);
}
返回视图(产品);
}
调整大小功能:
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
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;
double ratioW = (double)width / (double)image.Width;
double ratioH = (double)height / (double)image.Height;
double ratio = ratioW < ratioH ? ratioW : ratioH;
int insideWidth = (int)(image.Width * ratio);
int insideHeight = (int)(image.Height * ratio);
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
//graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
graphics.DrawImage(image, new Rectangle((width / 2) - (insideWidth / 2), (height / 2) - (insideHeight / 2), insideWidth, insideHeight), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
公共静态位图大小图像(图像图像、整型宽度、整型高度)
{
var destect=新矩形(0,0,宽度,高度);
var destImage=新位图(宽度、高度);
Destinmage.SetResolution(图像.水平分辨率,图像.垂直分辨率);
使用(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;
双比率=(双)宽度/(双)图像宽度;
双倍比率=(双倍)高度/(双倍)图像高度;
双倍比率=比率<比率?比率:比率;
int insideWidth=(int)(image.Width*比率);
int insidehheight=(int)(image.Height*比率);
使用(var wrapMode=newImageAttributes())
{
wrapMode.SetWrapMode(wrapMode.TileFlipXY);
//graphics.DrawImage(图像,析取,0,0,图像.宽度,图像.高度,GraphicsUnit.像素,wrapMode);
graphics.DrawImage(图像,新矩形((宽度/2)-(内部宽度/2),(高度/2)-(内部高度/2),内部宽度,内部高度),0,0,图像.宽度,图像.高度,GraphicsUnit.Pixel,wrapMode);
}
}
返回目标图像;
}
我能做些什么使它异步吗
Thanx我想您正在寻找类似的产品,有关详细信息,请参阅下面的文章: 或 对于图像处理,您需要使用异步方法版本而不是普通的同步方法(例如graphics.DrawImageAsync,如果存在的话)-不幸的是,我不相信该方法的*异步版本可用,因此您唯一的选择是生成新任务(将在线程池线程上运行) 您的更改如下所示(我只修改了异步/等待部分):
public async Task AddPicture(int?id,HttpPostedFileBase文件)
{
....
位图缩略图=等待调整大小图像(FinalBitmap,150150);
位图FullPicture=WAIT ResizeImage(最终位图,800600);
....
}
公共异步任务大小图像(图像图像、整型宽度、整型高度)
{
....
wait Task.Run(()=>{graphics.DrawImage(..)});
...
}我想您正在寻找类似的产品,有关详细信息,请参阅下面的文章: 或 对于图像处理,您需要使用异步方法版本而不是普通的同步方法(例如graphics.DrawImageAsync,如果存在的话)-不幸的是,我不相信该方法的*异步版本可用,因此您唯一的选择是生成新任务(将在线程池线程上运行) 您的更改如下所示(我只修改了异步/等待部分):
public async Task AddPicture(int?id,HttpPostedFileBase文件)
{
....
位图缩略图=等待调整大小图像(FinalBitmap,150150);
位图FullPicture=WAIT ResizeImage(最终位图,800600);
....
}
公共异步任务大小图像(图像图像、整型宽度、整型高度)
{
....
wait Task.Run(()=>{graphics.DrawImage(..)});
...
}将其包装在
任务中
但函数中没有我可以等待的东西。我原以为我会等graphics.DrawImage,但它是空的(你在等待任务..不需要放置await.Task将做你想要的事情,异步。它不会给你带来任何好处。将它包装在Task
中,但函数中没有我可以等待的东西。我原以为我会等待graphics.DrawImage,但它是无效的。:(你在等待任务..不需要放置await.Task将做你想做的事情。)
public async Task<ActionResult> GizmosAsync()
{
ViewBag.SyncOrAsync = "Asynchronous";
var gizmoService = new GizmoService();
return View("Gizmos", await gizmoService.GetGizmosAsync());
}
await Task.Run(()=>{ ... DrawImage() ... })
public async Task<ActionResult> AddPicture(int? id, HttpPostedFileBase file)
{
....
Bitmap Thumbnail = await ResizeImage(FinalBitmap, 150, 150);
Bitmap FullPicture = await ResizeImage(FinalBitmap, 800, 600);
....
}
public async Task<Bitmap> ResizeImage(Image image, int width, int height)
{
....
await Task.Run(()=>{ graphics.DrawImage(....) });
...