2012-11-26 34 views
3

我有一个潜在的问题。我有存储在数据库中的图像,然后我用我的应用程序中的C#方法获取图像,并将其存储在看起来像这样的自定义类:在HTML标记中使用System.Drawing.Image

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); 
} 

什么我做错了任何想法?

+1

你需要服务的形象。您不能只将图像数据粘贴在页面中。你可以对它进行64位编码,但这种方法存在局限性,它不适用于除图标之类的任何东西。 – Brad

+0

运行你的网站,右键单击并查看源代码,看看有什么。你的浏览器也可能有一个错误控制台(我知道firefox至少),你也应该检查错误。 –

+0

你使用的是什么样的ASP? – GolfWolf

回答

7

我最终用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(); 
} 

目前这个工作,我的目的,所以,谢谢你给大家,他们的建议,一如既往每个人在,但并有助于:-)

+0

我使用此解决方案动态创建HtmlImage对象,如上所述分配Src属性,并最后将新对象添加到现有面板控件。 – sonyisda1

1

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

如果您在使用图像格式时遇到问题,那么只需查看源代码并确保它是正确的。

1

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

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

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

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

Here is a basic tutorial让你开始。

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

2

图像可以使用通用的处理程序(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' /> 

快乐编码!