13

<img src="myws.ashx?x=100>ac#Webベースのサービスを使用してHTML要素から呼び出される画像を生成する赤い正方形のような単純なPNG画像を作成できるようにしたいと思います。

HTMLの例:

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

私を始めるためだけに、単純な(動作する)C#クラスをまとめることができる人はいますか?一度オフにすると、これを終了して、実際にやりたいことを実行できると確信しています。

  • 最終的なゲームは、パフォーマンスメトリックなどを表示するデータ駆動型Webページの単純な赤/琥珀/緑(RAG)埋め込みステータスマーカーを作成することです*
  • 将来的に透明度を使用する予定なので、PNGを使用したい*
  • ASP.NET 2.0 C#ソリューションをお願いします...(私はまだ本番3.5ボックスを持っていません)

tia

解決

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

6 に答える 6

21

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"/>
于 2009-05-20T13:52:56.143 に答える
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);
于 2009-05-20T13:47:47.417 に答える
2

@Lloydの答えは良いスタートだと思います。

アルファ透明度と PNG で問題が発生しました。C# でアルファ透明度の PNG を作成できますか?

于 2009-05-20T14:03:35.013 に答える
0

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

これを確認してください:http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx

于 2009-05-20T13:52:56.330 に答える
0

また、これをどのように実装するかによっては、DOS 攻撃の準備ができている可能性があることに注意してください。イメージの生成は、最もプロセッサに優しいものではありません。この潜在的な問題点を軽減するために、何らかの認証やキャッシュ メカニズムを用意してください。

于 2009-05-20T13:57:42.327 に答える