我有一个控件,它返回字符串和 System.Drawing.Image 类型的字典。我想遍历字典并输出一个显示每个键值对中包含的图像的 ASP 图像控件。我知道这需要通过 HTTP 处理程序来完成,但不确定如何去做。假设图像需要转换为字节数组,然后作为处理程序的输出流返回,图像或字节数组如何作为处理程序上下文的一部分传递?
4 回答
网络上的大多数示例都将 id 传递给 ashx 处理程序;处理程序路径与 id 一起设置为图像控件的源。在大多数情况下,对处理程序的每个请求都将访问数据库并获取图像,进行处理并渲染图像。
但是,在您的情况下,您似乎已经有了图像字典(因此您需要一种方法将该信息传递给处理程序)。解决此问题的一种方法是将图像缓存为内存流,在 ashx 处理程序中,您可以访问 cahced 项目并稍后清除缓存。这已经在这里讨论过;但不是优雅的解决方案。
您可能还想查看Scott Hanselman 的这篇博客文章,他在其中谈到了对<asp:image/>
您可以调用Image.Save方法。
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.WriteTo(context.Response.OutputStream);
}
您需要正确返回 Content Type 和 Stream,请参阅此 链接以供参考
在这里,我假设您将字典对象绑定到转发器,并且 HttpHandler 名称是 imageHandler。因此,一旦绑定了字典对象,您将获得类似
<ItemTemplate> <asp:Image id="image1" runat="server" ImageUrl='<%# "~/imageHandler.ashx?k=" + Eval("key")%>' />
</ItemTemplate>
在您的 httphandler 中读取将为您提供密钥的查询字符串,然后您可以从字典中获取 system.drawing.image 之后您可以将其转换为 bytearray 并继续进行。
您可以进一步重构您的代码,以便您可以将所有键值作为列表或枚举获取并绑定它,然后在 httphandler 中查询数据库。
Response.Write(byte array) and response.contenttype= "give the correct content type"
希望这可以帮助。