【问题标题】:Displaying images derived from a byte-array dynamically on a page在页面上动态显示从字节数组派生的图像
【发布时间】:2009-04-30 16:12:54
【问题描述】:

我正在调用一个 Web 服务,它以字节数组的集合的形式返回未知数量的图像。 (我无法改变)

我需要在单个 aspx 网页上显示每个图像。

我目前正在使用 Microsoft.Web.GeneratedImage 控件; http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449 显示图像。

我遇到的问题是,由于控件调用单独的代码文件来加载图像内容,我使用会话状态来存储字节数组,我对此并不太满意。

这是我的测试项目中的一些代码;

     Private Sub btnGetChart_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetChart.Click
    Dim reportHub As New HubWrapper

    Dim repCharts() As ReportHub.Chart = reportHub.ReportHubChart(Me.ddlReports.SelectedValue, ViewState("params"))

    For Each chart As ReportHub.Chart In repCharts
      Dim sessionKey As String = "img" & System.Guid.NewGuid().ToString

      Dim imgParam As New Microsoft.Web.ImageParameter()
      imgParam.Name = "sessionVar"
      imgParam.Value = sessionKey

      Session(sessionKey) = chart.ChartData

      Dim img As New Microsoft.Web.GeneratedImage
      img.ImageHandlerUrl = "~/chartImageHandler.ashx"
      img.Parameters.Add(imgParam)

      phChart.Controls.Add(img)
    Next
  End Sub

<%@ WebHandler Language="VB" Class="chartImageHandler" %>

Imports System
Imports System.Collections.Specialized
Imports System.Drawing
Imports System.Web
Imports Microsoft.Web

Public Class chartImageHandler
  Inherits ImageHandler

  Implements IRequiresSessionState

  Public Sub New()
    MyBase.New()
    'Set caching settings and add image transformations here
    'EnableServerCache = True

  End Sub

  Public Overrides Function GenerateImage(ByVal parameters As NameValueCollection) As ImageInfo
    Dim byteArry As Byte() = CType(HttpContext.Current.Session(parameters("sessionVar")), Byte())

    HttpContext.Current.Session.Remove(parameters("sessionVar"))

    Return New ImageInfo(byteArry)

  End Function
End Class

实现这一目标最优雅的方式是什么?

欢迎任何意见!!!

编辑:附加信息;

  • 来自网络服务的图像是 来自 SQL 报告服务。
  • 图像通常是 一直在变化(没有真正的 缓存要求)。
  • 图像将是用户特定的。
  • Web 服务每页只调用一次。
  • 我实际上正在处理来自 生成后的会话状态 图像使用它,因为图像不会 需要再次查看 同时。

【问题讨论】:

    标签: asp.net vb.net image bytearray codeplex


    【解决方案1】:

    我想您希望每个页面请求只调用一次 Web 服务。事实上,以某种方式缓存字节数组会很好,这样在用户暂时离开页面然后又回来的情况下,不会再次调用 Web 服务。在这种情况下,在会话中保存字节数组是不可避免的。如果你没有使用 GeneratedImage 控件,你仍然需要将字节数组保存在某个地方。

    我理解您对大型会议的担忧。根据您的应用程序的详细信息,您可以采取一些措施来避免它。是所有图像都指向单个用户,还是一些图像在用户之间共享?图像经常变化吗?如果所有图像都属于单个用户并且经常更改,那么将它们保存在会话中是唯一的解决方案。但是,如果某些用户共享图像或者图像不会经常更改,那么您可以在 Web 服务和 Web 应用程序之间创建一个代理。代理会将图像保存在内存中或数据库中(或者可能在文件系统中),并通过 URL 映射使它们作为资源可用。您需要根据应用程序的内部定义此映射。可能是这样的:

    http://imageproxy/username/photo123123
    

    您还需要创建一个 URL 以返回可用图像的数量:

    http://imageproxy/username/imagecount
    

    不需要使用 GeneratedImage 组件。您可以使用标准的 img 标签轻松构建页面的 html 源代码。

    【讨论】:

    • 来自 Web 服务的图像来自 SQL Reporting Services。图像通常会一直在变化。图像将是用户特定的。每个页面只调用一次 Web 服务。缓存可能是个好主意,我可能只使用 web.caching 很短的时间。在生成的图像使用它之后,我实际上是从会话状态处理图像,因为希望在一段时间内不需要再次查看图像。
    【解决方案2】:

    您可以使用data: URI 方案将图像数据直接嵌入到页面源中。 Here's the Wikipedia description。但是,这不适用于 8 之前的 IE 版本,这可能会使您无法接受这种情况。

    【讨论】:

    • 哦,IE
    • 工作得很好.... IE 的唯一问题是数据 uri 的大小限制。 Convert.ToBase64String(imageToDisplay).Length
    【解决方案3】:

    在 asp.net 中,您可以直接使用响应对象编写和图像,主要浏览器将能够显示它。但是不能传递字节数组,需要传递内存流。

    获取您的System.Web.HttpContext

    Dim ms as New Io.MemoryStream(yourarray)
    httpcontext.Response.OutputStream.Write(ms.ToArray,0,ms.Length)
    

    你把它放在一个 display.aspx 页面中,如果“yourarray”是一个代表图像的字节数组,浏览器将显示它。

    然后您可以在任何页面(甚至是纯 html)上使用图像控件并将图像源设置为“display.aspx”,然后您的图像就会显示出来。

    现在,由于您有多个图像,您可能需要创建一个控件并为其创建多个实例,一个用于传递相应字节数组的每个图像。

    【讨论】:

    • 以前曾使用此方法显示数据库中的图像...我最初想找到一种“更好”的显示图像的方法,因此查看了 microsoft.generatedimage 控件...。也有它的缺点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2017-01-13
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多