【问题标题】:Bind Image to Image Control将图像绑定到图像控件
【发布时间】:2013-12-28 09:16:48
【问题描述】:

我想转换 byte[] 数组中的图像并再次将 byte[] 数组转换为图像并将该图像与图像控件绑定。请检查以下代码:

 private void ShowImage()
        {

            var img = new System.Drawing.Bitmap(@"C:\Users\User\Desktop\Section-13.png");
            byte[] image = imageToByteArray(img);
            Image image1 = byteArrayToImage(image);
            Image2.ImageUrl = image1.ToString();
        }

        public byte[] imageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }

        public Image byteArrayToImage(byte[] byteArrayIn)
        {

            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

图像控制:

<asp:Image ID="Image2" runat="server" />

正如您在上面的代码中看到的那样,我通过将图像转换为字符串将图像传递到 Image2.ImageUrl 中。我知道我做错了。请建议我是否走在正确的轨道上。

我在 GridView 中搜索并找到绑定图像,但上面的代码只是据我所知,我的目标只是简单地获取图像。提前致谢。

【问题讨论】:

  • image1.ToString() 是将图片转换为字符串数据,而不是存储url,所以我认为你应该先将图片存储到服务器路径,然后Image2.ImageUrl = imagepath。跨度>
  • 您的意思是说我首先将图像存储在本地的任何临时位置,然后将该 URL 传递给图像控件。对吗?
  • 是的,我认为这是最简单的方法,虽然别人说的可能有帮助,但我觉得太复杂了。

标签: c# image


【解决方案1】:

创建一个http处理程序并将处理程序传递给img src标签

 <img src="/imagehandler.ashx" />




 public class ImageHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            byte[] buffer = imageToByteArray();
            context.Response.OutputStream.Write(buffer , 0, buffer .Length);
            context.Response.ContentType = "image/JPEG";
        }
    }

【讨论】:

  • 为什么要将整个图像加载到内存中?如果图像很大并且您有很多请求怎么办?使用这种方法可能会很快耗尽内存。有关实现此类处理程序的正确方法,请参阅我的答案。
  • @DarinDimitrov:同意我的方法会损害性能。但是如果在这种情况下图像在 filsytem 上不可用
  • 不,我的意思是在你的 ProcessRequest 中你不应该使用imageToByteArray();。再次检查我的通用处理程序以了解实现此功能的正确方法。请注意,在我的示例中,图像不在网站的文件夹结构中(可能性 1)。请注意WriteFile 方法的使用,该方法将图像以块的形式直接流式传输到响应,而不像您的示例中那样将其完全加载到缓冲区中。
【解决方案2】:

最简单的解决方案是简单地将 Section-13.png 复制到 Web 应用程序的文件夹结构中,然后将 ImageUrl 属性指向它:

Image2.ImageUrl = "~/images/Section-13.png";

另一方面,如果您想从 Web 应用程序之外的某个位置引用图像,那么您有两种可能性:

  1. 编写一个通用处理程序,它将图像流式传输到响应,然后将 ImageUrl 属性指向这个通用处理程序:

    public class MyImageHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "image/png";
    
            context.Response.WriteFile(@"C:\Users\User\Desktop\Section-13.png");
        }
    
        public bool IsReusable
        {
            get { return true; }
        }
    }
    

    然后:

    Image2.ImageUrl = "~/MyImageHandler.ashx";
    
  2. 使用Data URI scheme 嵌入图像。在这种情况下,您可以直接使用&lt;img&gt; HTML 标签:

    <img src="data:image/png;base64,<%= Convert.ToBase64String(System.IO.File.ReadAllBytes(@"")) %>" alt="C:\Users\User\Desktop\Section-13.png" />
    

【讨论】:

  • 感谢您的回复,但这不是我的目标,根据我的要求,我在 byte[] 数组中获取图像,我必须将数组转换回图像,然后与图像绑定控制。
  • 抱歉,这是不可能的。您可以在 Winforms 或 WPF 应用程序中执行此操作,但不能在 Web 应用程序中执行此操作。实现它的唯一方法是使用 Data URI 方案,但请记住,并非所有浏览器都支持它。我已经更新了我的答案,以说明嵌入到 &lt;img&gt; 标记中的数据 URI 方案的示例。
【解决方案3】:

尝试制作Data URL Scheme

data:[<MIME-type>][;charset=<encoding>][;base64],<data>

在图像控制中

<asp:image id="reddot" runat="server" ImageUrl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" />

我们通常用这种方法来调整图片大小和动态图片

http://i-skool.co.uk/net/resize-and-optimise-image-class-in-c/

Image2.ImageUrl = "data:image/png;base64,"  + Convert.ToBase64String(imageToByteArray(image1))

图像到字节数组

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
 MemoryStream ms = new MemoryStream();
 imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
 return  ms.ToArray();
}

【讨论】:

    【解决方案4】:

    我也会使用这个 Image Handler 来处理这个图像。我使用此示例代码通过 .ashx 处理程序检索我的网络表单中的图像

     Context.Session["emp"] = "anything u could pass your id or something";
     Image1.ImageUrl = "~/img.ashx";
    

    我通过 Context.Session 传递了 id 并调用了 img.ashx--> 我的处理程序

    我做的内部处理程序

     public class img : IHttpHandler,System.Web.SessionState.IReadOnlySessionState
        {
            Connection connect = new Connection();
            public void ProcessRequest(HttpContext context)
            {
                if (context.Session["emp"].ToString() != null)
                {
                    try
                    {
                        string text;
                        text =retrive your data from here by using  context.Session["emp"]
                        DataTable dt1 = connect.exexc(text, connect.connectfunction());
                        if (dt1.Rows.Count > 0)
                        {
                            string img = dt1.Rows[0].ItemArray[0].ToString();--> i retrived the byte array here
                            byte[] imageBytes = Convert.FromBase64String(img);
                            context.Response.ContentType = "image/JPEG";
                            context.Response.BinaryWrite(imageBytes);
                        }
                     }
                    catch
                    {
    
                    }
                }
             }
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多