2009-05-20 83 views
11

我希望能夠創建一個簡單的PNG圖像,例如使用基於c#的基於Web的服務來生成圖像的紅色正方形,從<img src="myws.ashx?x=100>HTML元素調用。用C#創建PNG圖像HttpHandler webservice

一些示例HTML:

<hmtl><body> 
    <img src="http://mysite.com/webservice/rectangle.ashx?size=100"> 
</body></html> 

是否有任何人誰可以湊齊一個簡單的(工作)C#類只是爲了讓我開始?一旦離開,我確信我可以完成這一切,實際上做我想做的事情。

  • 最後一步就是創建簡單的紅色/黃色/綠色(RAG)的嵌入式狀態的數據驅動的Web頁面,顯示性能指標等*標記
  • 我想它,因爲我預計使用使用PNG的透明度在未來*
  • ASP.NET 2.0 C#的解決方案,請...(我沒有生產3.5框還)

TIA

SOLUTION

rectangle.html

<html> 
<head></head> 
<body> 
    <img src="rectangle.ashx" height="100" width="200"> 
</body> 
</html> 

rectangle.ashx

<%@ WebHandler Language="C#" Class="ImageHandler" %> 

rectangle.cs

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Web; 

public class ImageHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     int width = 600; //int.Parse(context.Request.QueryString["width"]); 
     int height = 400; //int.Parse(context.Request.QueryString["height"]); 

     Bitmap bitmap = new Bitmap(width,height); 

     Graphics g = Graphics.FromImage((Image) bitmap); 
     g.FillRectangle(Brushes.Red, 0f, 0f, bitmap.Width, bitmap.Height); // fill the entire bitmap with a red rectangle 

     MemoryStream mem = new MemoryStream(); 
     bitmap.Save(mem,ImageFormat.Png); 

     byte[] buffer = mem.ToArray(); 

     context.Response.ContentType = "image/png"; 
     context.Response.BinaryWrite(buffer); 
     context.Response.Flush(); 
    } 

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

你可以讓一個http處理程序返回一個圖像嗎?可以說一個位圖圖像或一個字節[]緩衝區到一個c#方法(代碼在文件後面)從它被稱爲?我很抱歉,如果我聽起來很蠢,但我是新來的HTTP處理程序 – zack 2010-10-27 15:00:21

+0

@YP,看到接受的答案?否則我不明白你的意思,坦率地說,我不知道怎麼做。我的c#是bleh! – Guy 2010-11-01 11:26:01

+0

@guy感謝您發佈解決方案 - 幫了我很多! – 2012-06-13 09:31:11

回答

20

Web服務,特別是SOAP期待之類的東西,在通話的詳細信息的XML信封你會更好使用HttpHandler

事情是這樣的:

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Web; 

public class ImageHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     int width = int.Parse(context.Request.QueryString["width"]); 
     int height = int.Parse(context.Request.QueryString["height"]); 

     using (Bitmap bitmap = new Bitmap(width,height)) { 

      ... 

      using (MemoryStream mem = new MemoryStream()) { 
       bitmap.Save(mem,ImageFormat.Png); 
       mem.Seek(0,SeekOrigin.Begin); 

       context.Response.ContentType = "image/png"; 

       mem.CopyTo(context.Response.OutputStream,4096); 
       context.Response.Flush(); 
      } 
     } 
    } 

} 

這是非常粗略的,當然。你叫它則:

<img src="myhandler.ashx?width=10&height=10"/> 
3

Web服務是不適合的。它以特定的格式(通常是SOAP)返回消息,因此它不能成爲圖像。

改爲使用常規的Web表單,在此刪除除@page指令以外的所有標記。使用BinaryWrite方法將圖像數據寫入響應流。

例子:

byte[] imageData; 
using (Bitmap image = new Bitmap(10,10)) { 
    using (Graphics g = Graphics.FromImage(image)) { 
     g.Clear(Color.Red); 
    } 
    using (MemoryStream m = new MemoryStream()) { 
     image.Save(m, ImageFormat.Png); 
     imageData = m.ToArray(); 
    } 
} 
Response.ContentType = "image/png"; 
Response.BinaryWrite(imageData); 
+0

我唯一要做的就是使用通用處理程序(.ashx文件)。不需要所有的頁面(.aspx)開銷。 – Keltex 2009-05-20 13:52:42

+0

實際上可以通過Web服務完成此操作;我用PDF來做。關鍵是將它作爲一個字節數組返回,在另一端重新構造它,然後用適當的ContentType寫出它。 – 2009-05-22 21:18:09

+0

@Adam V:然後你只使用Web服務作爲網頁的後端。正如Guy所要求的那樣,您無法直接使用Web服務的響應。 – Guffa 2009-05-22 22:14:39

0

此外,取決於你如何實現這一點,請注意,你可能會在和自己的DOS攻擊。生成圖像不是處理器最友好的東西。請確保有一些身份驗證和/或緩存機制來幫助緩解這種潛在的痛點。

1

還有另一種方式來實現服務動態圖像。

namespace MyApp 
{ 
    [ServiceContract] 
    public interface IMyService 
    { 
     [WebGet(UriTemplate = "Image.png")] 
     [OperationContract] 
     Stream ShowImage(); 
    } 
} 

對於實現:

public Stream ShowImage() 
{ 
    Bitmap image = new Bitmap(@"C:\Image.png"); 
    Image image2 = new Bitmap(125, 125); 

    using (Graphics graphics = Graphics.FromImage(image2)) 
    { 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = SmoothingMode.HighQuality; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      graphics.CompositingQuality = CompositingQuality.HighQuality; 
      graphics.DrawImage(image, 0, 0, 125, 125); 
    } 

    MemoryStream imageAsMemoryStream = new MemoryStream(); 
    image2.Save(imageAsMemoryStream, ImageFormat.Png); 
    imageAsMemoryStream.Position = 0; 
    return imageAsMemoryStream; 
} 

啓動服務作爲一個普通WCF服務,並在您的app.config添加服務

(WebService = new WebServiceHost(typeof(MyService))).Open(); 

您可以傳遞參數,使其更動態。