2010-06-23 145 views
4

我有一個ASP.NET Web窗體。這個Web表單有一個生成一些HTML的事件處理程序。該HTML基於時間,這就是爲什麼它是在事件處理程序中創建的。根據一天中的時間,通過下面的方法以編程方式創建的圖像:將位圖添加到HTML

private Bitmap GetImageForTime(DateTime time) 
{ 
    Bitmap bitmap = new Bitmap(); 

    // Dynamically build the bitmap... 

    return bitmap; 
} 

我想正在生成HTML時,調用此方法。但是,我不想在服務器上寫入圖像。相反,我想找出一種方法將它與HTML一起寫出來。從某種意義上說,我試圖做到以下幾點:

protected void myLiteral_Load(object sender, EventArgs e) 
{ 
    string html = "<table><tr><td>"; 
    html += GetImageForTime(DateTime.Now); // This is the problem because it's binary. 
    html += "</td><td>"; 
    html += GetWeatherHtmlText(); 
    html += "</td></tr></table>"; 
    myLiteral.Text = html; 
} 

這可能嗎?如果是這樣,怎麼樣?

回答

0

爲把這段代碼的頁面創建一個名爲TimeImage.aspx另一個aspx頁面,然後在代碼隱藏在Page_Load:

void Page_Load(object sender, EventArgs args) { 
    string mime = "image/jpeg"; 
    Response.ContentType = mime; 

    Bitmap b = GetImageForTime(DateTime.Now); 

    var codec = ImageCodecInfo.GetImageEncoders().Where(i => i.MimeType == mime).SingleOrDefault(); 

    if(codec != null) 
     b.Save(Response.OutputStream, codec, null); 
} 

然後,讓你的HTML生成看起來像這樣:

protected void myLiteral_Load(object sender, EventArgs e) 
{ 
    string html = "<table><tr><td>"; 
    html += "<img src='TimeImage.aspx'>" 
    html += "</td><td>"; 
    html += GetWeatherHtmlText(); 
    html += "</td></tr></table>"; 
    myLiteral.Text = html; 
} 

這將創建一個img標記,調用TimeImage.aspx頁面,該頁面將響應MIME類型更改爲image/jpeg,將位圖轉換爲JPG,然後將其保存到響應輸出流,以便圖像標記可以將其顯示爲JPG。

如果您更喜歡不同的格式,只需在頂部更改MIME類型(例如,對於GIF爲「image/gif」,對於PNG爲「image/png」)。

1

HTML中的圖像由於HTML中的<img>元素而顯示。我不相信有任何其他方式在HTML頁面中顯示圖像。

您需要編寫一個處理程序,該程序可以通過<img>元素的src屬性中的URL調用。該處理程序將生成並返回圖像。

2

我這樣做的方式是在HTML中創建一個圖像標記,並將圖像源(<img src="xxx" />)指向動態創建圖像並返回(並且僅在響應流)上的頁面,正確的MIME類型。

5

我建議落實生成圖像,並將它作爲一個字節流IHttpHandler。然後在頁面的標籤中,將src屬性設置爲HTTP處理程序的地址。

例子:http://www.c-sharpcorner.com/uploadfile/desaijm/httphandlersforimages11152005062705am/httphandlersforimages.aspx

通用HTTP處理程序是非常簡單的創建一旦你意識到它們的存在:

public class TimeImageHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     Bitmap bitmap = GetImageForTime(DateTime.Now); 
     context.Response.ContentType = "image/jpeg"; 
     bitmap.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
    } 

    public bool IsReusable { get { return false; } } 
} 
0

除了使用數據URI方案的已經給出的解決方案或發送圖像動態創建(所以,沒有存儲它),還有一個奇怪的解決方案,你可以嘗試:每個單元的表格,每個單元格1像素高,寬和適當的背景,當然沒有邊界.. 。GIMP例如能夠以html的方式將圖像導出,如果您強制使用單元格和表格的大小,您可以將圖像看作是嵌入的圖像......當然,如果圖像很大,它會比較「沉重」,但它可以爲相對較小的圖像工作。

EDITED(斜體部分加)

+0

當然, GIMP的例子我並不是說你使用它來做到這一點......我只是說這很容易完成,就像在html中生成一個普通表,所以很多'html + ='... – ShinTakezou 2010-06-23 19:14:02