Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异步位图调整大小_C#_Asp.net_Asynchronous_Bitmap - Fatal编程技术网

C#异步位图调整大小

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

我想做位图大小调整的异步任务。我想我会添加wait到Graphics.DrawImage或位图。保存,但我不能。这是我的密码:

控制器:

    //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(....) });
    ...