使用2个参数返回图像的最佳方法是什么(x和y用于调整大小)。
例如
~/api/image12345/200/200
将返回200乘以200 jpg / png /或gif
我应该返回System.Drawing.Image
个对象还是手动定义HTTPReponseMessage.Content
?
答案 0 :(得分:135)
你不应该返回System.Drawing.Image
,除非你还添加了一个格式化程序,它知道如何将其转换为适当的字节,并不像你期望的那样将自身序列化为图像字节。
一种可能的解决方案是返回HttpResponseMessage
,其中包含存储在其内容中的图像(如下所示)。请记住,如果您需要问题中显示的网址,则需要一条映射{imageName},{width}和{height}参数的路线。
public HttpResponseMessage Get(string imageName, int width, int height)
{
Image img = GetImage(imageName, width, height);
using(MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(ms.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result;
}
}
但是,如果你在许多地方这样做,那么格式化路线可能是“推荐”的方式。作为编程中的几乎所有内容,答案将取决于您的场景。
答案 1 :(得分:19)
图像很重。 ASP.NET WebForms,HttpHandlers,MVC和Web API都在提供静态文件的绝对可怕的工作。 IIS做了非常的好工作 - 通常效率提高20-100倍。
如果您想获得良好的性能,请在PostAuthorizeRequest期间进行最新的 URL重写,这样IIS就可以选择并提供该文件。是的,这意味着HttpModule级事件处理。
[免责声明:我是以下文章和开源项目的作者]
如果您正在使用图片进行动态操作,请查看out this article on image processing pitfalls to avoid,并考虑查看ImageResizer。它具有出色的磁盘缓存(使用IIS静态文件处理),并且易于连接到任何类型的图像生成。如果你需要先进的话,它还有AForge,FreeImage和WIC的可选绑定。