在HTML标记中使用System.Drawing.Image

时间:2012-11-26 20:15:36

标签: c# html system.drawing

我有一个可能很容易的问题。我有一个存储在数据库中的图像,然后我在我的应用程序中使用了一个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 个答案:

答案 0 :(得分:9)

我最终选择Brads方法来解决这个问题(请参阅问题下的评论)我最终创建了一个方法,它接受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();
}

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

答案 1 :(得分: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' />

快乐的编码!

答案 2 :(得分:1)

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

如果您的图片格式存在问题,请查看您的来源并确保其正确无误。

答案 3 :(得分:1)

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

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

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

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

Here is a basic tutorial 让您入门。

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