返回具有 2 个参数(x 和 y 用于调整大小)的图像的最佳方法是什么。
例如
~/api/image12345/200/200
将返回 200 x 200 jpg/png/或 gif
我应该返回一个System.Drawing.Image
对象还是手动定义HTTPReponseMessage.Content
?
返回具有 2 个参数(x 和 y 用于调整大小)的图像的最佳方法是什么。
例如
~/api/image12345/200/200
将返回 200 x 200 jpg/png/或 gif
我应该返回一个System.Drawing.Image
对象还是手动定义HTTPReponseMessage.Content
?
您不应该返回 a System.Drawing.Image
,除非您还添加了一个知道如何将其转换为适当字节的格式化程序,它不会像您期望的那样将自身序列化为图像字节。
一种可能的解决方案是返回一个HttpResponseMessage
存储在其内容中的图像(如下所示)。请记住,如果您想要问题中显示的 URL,则需要一个映射 {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;
}
}
但是同样,如果您在很多地方都这样做,那么走格式化程序路线可能是“推荐”的方式。与编程中的几乎所有内容一样,答案将取决于您的场景。
图像很重。ASP.NET WebForms、HttpHandlers、MVC 和 Web API在提供静态文件方面都做得非常糟糕。IIS 在这方面做得非常好 - 通常效率提高 20-100 倍。
如果您想获得良好的性能,最迟在 PostAuthorizeRequest 期间执行 URL 重写,以便 IIS 可以获取并提供文件。是的,这意味着 HttpModule 级别的事件处理。
[免责声明:我是以下文章和开源项目的作者]
如果您正在对图像进行动态处理,请查看这篇关于要避免的图像处理陷阱的文章,并考虑查看ImageResizer。它具有出色的磁盘缓存(使用 IIS 静态文件处理),并且易于连接到任何类型的图像生成。如果您需要更高级,它还具有 AForge、FreeImage 和 WIC 的可选绑定。