Создание PNG-изображения с помощью веб-службы C # HttpHandler - PullRequest
13 голосов
/ 20 мая 2009

Я хотел бы иметь возможность создавать простое изображение PNG, скажем, красного квадрата, используя веб-сервис c # для генерации изображения, вызываемого из элемента <img src="myws.ashx?x=100> HTML.

пример HTML:

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

Есть ли кто-нибудь, кто мог бы собрать простой (работающий) класс C # только для того, чтобы начать? Когда я уйду и уйду, я уверен, что смогу закончить это, чтобы сделать то, что я хочу.

  • Конец игры заключается в создании простых красных / янтарных / зеленых (RAG) встроенных маркеров состояния для управляемой данными веб-страницы, которая показывает показатели производительности и т. Д.
  • Я бы хотел, чтобы он использовал PNG, как я ожидаю в будущем, используя прозрачность *
  • Решение ASP.NET 2.0 C #, пожалуйста ... (У меня еще нет версии 3.5)

ТИА

РЕШЕНИЕ

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

Ответы [ 6 ]

21 голосов
/ 20 мая 2009

Веб-сервисы, особенно 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 голосов
/ 20 мая 2009

Веб-сервис не подходит для этого. Он возвращает сообщение в определенном формате, обычно SOAP, поэтому это не может быть изображение.

Вместо этого используйте обычную веб-форму, где вы удаляете всю разметку, кроме директивы @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);
2 голосов
/ 20 мая 2009

Я думаю, что ответ @ Ллойда - хорошее начало.

У меня были проблемы с альфа-прозрачностью и PNG: Можете ли вы сделать альфа-прозрачный PNG с C #?

1 голос
/ 26 ноября 2012

Существует еще один способ обработки динамического изображения.

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

Вы можете передавать параметры, чтобы сделать его более динамичным.

0 голосов
/ 20 мая 2009

Кроме того, в зависимости от того, как вы это реализуете, имейте в виду, что вы можете настроить себя для атаки DOS. Генерация изображений не самая удобная для процессора вещь. Пожалуйста, убедитесь, что у вас есть механизм аутентификации и / или кэширования, чтобы помочь устранить эту потенциальную болевую точку.

0 голосов
/ 20 мая 2009

Невозможно вывести изображение из WebService.

Проверьте это: http://www.c -sharpcorner.com / UploadFile / gnsrinivas1511 / Webservice05112009034709AM / Webservice.aspx

...