2009-05-20 14 views
11

でPNG画像を作成し、私はシンプルなPNGイメージを作成できるようにしたいのですが、<img src="myws.ashx?x=100> HTML要素から呼び出された画像を生成するためにC#のウェブベースのサービスを使用して赤い四角で言います。C#のHttpHandler Webサービス

いくつかの例のHTML:

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

はちょうど私が始めるために一緒に簡単な(ワーキング)C#クラスを考え出すことができ、誰もがありますか?一度やり直したら、私がやりたいことを実際にやるためにこれを終えることができると確信しています。

  • エンドゲームは私が使用して予想されるとして、それはPNG年代を使用したい
  • *パフォーマンスメトリックなどを示したデータ駆動型のWebページのためのシンプルなレッド/アンバー/グリーン(RAG)埋め込まれた状態のマーカーを作成することです将来的には透明性*
  • 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#メソッド(コードビハインドファイル)のどこから呼び出すことができますか?私はstupipdの音を鳴らしても申し訳ありませんが、私はhttpハンドラの新人です – zack

+0

@YP、受け入れられた答えを見ますか?それ以外の場合、私はあなたが意味することと率直に理解していない、とにかくそれを行う方法を知りません。私のC#はblehです! – Guy

+0

@guy解決策を投稿してくれてありがとう - 私を助けてくれました! –

答えて

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"/> 
+2

はい、私はビットを逃しました。新しい項目の追加ダイアログに入ると、HttpHandlerが正しく作成されるか、IHttpHandler上にマウスを置いて「このインターフェースを実装する」を選択します。 これは次のようなものです。 public bool IsReusable {get {return true; }} – Lloyd

+0

ありがとうございます!また、Response.ContentTypeとImageFormat.Pngのマイナーなタイプミスです。 何かを描画するために取得する必要があります。 – Guy

+1

キャッシングについては、HttpRuntime.Cacheを使用することができますが、そこのMemoryStreamからの戻り値。 – Lloyd

3

Webサービスは、このためには適していません。特定の形式(通常はSOAP)のメッセージを返すので、イメージにすることはできません。あなたは@pageディレクティブを除くすべてのマークアップを削除するところ

は、代わりに通常のWebフォームを使用します。画像データを応答ストリームに書き込むには、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

+0

これは実際にはWebサービスを通じて行うことができます。私はPDFでそれをする。キーはバイト配列として返し、もう一方の端でそれを再構成し、適切なContentTypeで書き出すことです。 –

+0

@Adam V:その後、WebサービスをWebページのバックエンドとしてのみ使用しています。 Guyが要求したように、Webサービスからの応答を直接使用することはできません。 – Guffa

0

WebServiceから画像を出力することはできません。この

チェック:http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx

+0

これは、Webサービスをどのように表示するかによって異なります。マルチパートのMIMEエンコーディングを使用してC#Web APIを使用してバイナリ(イメージ)を返すことは、完全に可能です。それは終わった。初心者のためにこれを参照してください:http://en.wikipedia.org/wiki/MIME これはC# – Demi

+1

で行うのが大変難しいことではありません。 <<同意します。 – NinethSense

+0

Guffaの投稿にあるように、バイナリを返すだけです。 :-) – Demi

0

はまた、あなたがこれを実装する方法に応じて、あなたはDOS攻撃のために自分自身を設定することができることに注意してください。画像を生成することは、最もプロセッサに優しいことではありません。この潜在的な苦境を緩和するために、いくつかの認証およびキャッシング機構を用意してください。

+0

内部/イントラネット専用ですが、キャッシュを実装する必要があります。ありがとう。 – Guy

2

@Lloydの答えは良いスタートだと思います。 Can you make an alpha transparent PNG with C#?

+0

ハ!私は最後の1時間のあなたの質問を勉強してきました。私がちょうど "シンプルなもの"の一部を手に入れることができれば、私は私の不満なC#の知識でもこれを終えることができると確信しています。 – Guy

1

ダイナミック画像を提供する達成する別の方法があります:

私は、アルファ透明度やPNG画像に問題がありました。実装のために

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

あなたはより多くのそれを作るためにパラメータを渡すことができます動的。

関連する問題