Создание PNG-изображения с помощью C# HttpHandler webservice
Я хотел бы иметь возможность создавать простое 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#, чтобы я начал? Как только я уйду, я уверен, что смогу закончить это, чтобы действительно сделать то, что я хочу.
- конец игры, чтобы создать простой красный / Янтарный / зеленый (тряпка) встроенные маркеры состояния для веб-страницы, управляемой данными, которая показывает показатели производительности и т. д.*
- я хотел бы использовать PNG, как я ожидаю, используя прозрачность в будущем*
- ASP.NET 2.0 c# решение Пожалуйста... (У меня еще нет производственной коробки 3.5)
ТИА
решение
прямоугольник.HTML-код
<html>
<head></head>
<body>
<img src="rectangle.ashx" height="100" width="200">
</body>
</html>
прямоугольник.ashx
<%@ WebHandler Language="C#" Class="ImageHandler" %>
прямоугольник.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 ответов
веб-службы, особенно 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"/>
веб-служба не подходит для этого. Он возвращает сообщение в определенном формате, обычно SOAP, поэтому это не может быть изображение.
вместо этого используйте обычную веб-форму, где вы удаляете всю разметку, кроме
Я думаю, что ответ @Lloyd-хорошее начало.
У меня были проблемы с Альфа-прозрачностью и PNGs:можете ли вы сделать Альфа-прозрачный PNG с C#?
есть еще один способ выполнить обслуживание динамического изображения.
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 и добавьте службу в приложение.config
(WebService = new WebServiceHost(typeof(MyService))).Open();
вы можете передать параметры, чтобы сделать его более динамичным.
невозможно вывести изображение из веб-службы.
проверьте это: http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx
кроме того, в зависимости от того, как вы это реализуете, имейте в виду, что вы можете настроить себя для DOS-атаки. Генерация изображений-не самая дружелюбная вещь для процессора. Пожалуйста, убедитесь, что есть какой-то механизм аутентификации и / или кэширования, чтобы помочь облегчить эту потенциальную точку боли.