3

我有一个可能很简单的问题。我将图像存储在数据库中,然后在我的应用程序中使用 C# 方法获取该图像并将其存储在如下所示的自定义类中:

public class MyImage
{
 public System.Drawing.Image myImageFromDB;
 public string imageName;
 public int imageNumberInCollection;
}

我的问题是:我可以/如何在 HTML 图像标签中使用此类中的图像吗?我尝试了以下操作,但它只返回一个带有红色 X 的框:

//myImageFromDBCollection is a list of MyImage objects
foreach(var ind in myImagesFromDBCollection)
{
  table += String.Format("<image src={0} />", ind.myImageFromDB);
}

关于我做错了什么的任何想法?

4

4 回答 4

11

我最终选择了 Brads Method 来解决这个问题(请参阅问题下的评论)我最终创建了一个方法,该方法接受 System.Drawing.Image 并将其转换为字节数组,然后对该字节数组进行编码以获取图像。代码如下所示:

byte[] imgBytes = turnImageToByteArray(ind.ind.myImageFromDB);
string imgString = Convert.ToBase64String(imgBytes);
table += String.Format("img src=\"data:image/Bmp;base64,{0}\">", imgString);

private byte[] turnImageToByteArray(System.Drawing.Image img)
{
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
  return ms.ToArray();
}

目前,这适用于我的目的,所以感谢大家和他们的建议,尽管每个人都会来帮助:-)

于 2012-11-26T21:09:54.290 回答
3

可以使用通用处理程序(ashx 文件)提供图像:

public class StickerHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/png";
        context.Response.Cache.SetCacheability(HttpCacheability.Public);
        context.Response.BufferOutput = false;

        //TODO: link your MyImage to iSource using imageId query parameter...
        Image iSource = null;
        MemoryStream ms = new MemoryStream();
        iSource.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        byte[] data = ms.ToArray();
        ms.Dispose();
        g.Flush();
        g.Dispose();
        iSource.Dispose();

        context.Response.BinaryWrite(data);
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }

}

可以在此处找到有关通用处理程序的更多信息:

http://msdn.microsoft.com/en-us/library/bb398986(v=vs.100).aspx

在您的图像中:

<img src='StickerHandler.ashx?img=imageId' />

快乐编码!

于 2012-11-26T20:27:08.070 回答
1

如果我是你,我会将图像文件保存在磁盘上,并且只在你的数据库中保存图像文件名。

如果您的图像格式有问题,请查看您的来源并确保它是正确的。

于 2012-11-26T20:20:04.093 回答
1

如果您必须将图像存储在数据库中,查看它们的一种简单方法是使用图像处理程序。

基本上,您可以创建一个ASHX处理程序,它接受一个查询字符串,即数据库中的图像 ID,并返回图像内容以及正确的 mime 类型。这在 C# 中非常简单。

然后,您可以将<img />标记指向具有指定 ID 的处理程序。就像是

table += String.Format("<image src='/ViewImage.ashx?id={0}' />", ind.myImageId);

这是一个让您入门的基本教程。

一个常见的性能改进是将图像缓存在处理程序中的磁盘上。

于 2012-11-26T20:26:43.097 回答