2009-05-20 12 views
11
Basit PNG görüntüsü oluşturmak için muktedir istiyorum

ile PNG resim oluşturma, bir <img src="myws.ashx?x=100> HTML öğesi çağrılan görüntüyü oluşturmak için bir C# web tabanlı hizmetini kullanarak kırmızı bir kare söylüyorlar.C# HttpHandler webservice

bazı örnek HTML:

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

var mıdır birlikte basit (çalışma) C# sınıfı kaldırım taşı olabilir herkes sadece bana başlamak nedir? Bir kez çıkıp gideceğimden eminim ki bunu yapmak istediğimi yapmak için bunu bitirebilirim.

  • Sonu oyunu performans ölçümlerini vb * gösteren bir veri odaklı web sayfası için basit Kırmızı/Sarı/Yeşil (RA) gömülü durum işaretleri oluşturmaktır
  • kullandığımı tahmin gibi PNG kullanarak kullanmak istiyorum gelecekte * şeffaflık
  • ASP.NET ...

tia

çÖZÜM (henüz üretim 3.5 kutu yok) lütfen 2.0 C# çözüm

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

Bir http işleyicisi bir görüntüyü döndürür mü? bir bitmap görüntüsü veya bir byte [] arabelleği, çağrıldığı yerden bir C# yöntemine (kod arkasındaki kod) söyleyelim mi? Aptalca ses çıkardığım için özür dilerim ama http: – zack

+0

@YP için yeni durumdayım, kabul edilen cevaba bakın. Aksi halde ne demek istediğini anlamıyorum ve açıkçası, nasıl yapacağımı bilmiyorum. Benim C# – Guy

+0

@guy Çözümü yayınladığınız için teşekkürler - bana çok yardımcı oldu! –

cevap

20

Web hizmetleri, özellikle SABUN içinde aramanın ayrıntıları ile bir XML zarf gibi şeyler bekliyoruz Bir HttpHandler kullanarak daha iyi olurdu.. Böyle

şey:

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

} 

Bu tabii çok kaba. Bunu çağırabilirdiniz:

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

Evet Yeni Öğe Ekle iletişim kutusuna girerseniz, düzgün bir şekilde bir HttpHandler oluşturacaksınız veya IHttpHandler üzerinde gezinin ve "Bu arabirimi uygula" yı seçin. genel yayın IsReusable {get {return true; }} – Lloyd

+0

Teşekkürler - anladım! Ayrıca Response.ContentType ve ImageFormat.Png küçük yazım hatası Şimdi sadece bir şey/şey çizmek için almanız gerekir ... – Guy

+1

HttpRuntime.Cache kullanabilirsiniz önbelleğe alma için, sadece byte döküm [] oradaki MemoryStream'den geri dönün. – Lloyd

3

Bir web hizmeti Bunun için uygun değildir. Belirli bir biçimde, tipik olarak SOAP içinde bir mesaj döndürür, bu yüzden bir görüntü olamaz. Eğer @page yönergesi dışındaki tüm işaretlemeyi kaldırın nerede

yerine Normal bir web formu kullanın. Görüntü verisini yanıt akışına yazmak için BinaryWrite yöntemini kullanın.

Örnek:

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

Bunu yapacağım tek değişiklik, genel işleyici (.ashx dosyası) kullanmaktır. Tüm sayfa (.aspx) ek yüküne gerek yoktur. – Keltex

+0

Aslında bunu bir web servisi aracılığıyla yapmak mümkündür; PDF'lerle yapıyorum. Anahtar, bayt dizisi olarak döndürmek, diğer ucunda yeniden oluşturmak ve sonra uygun ContentType ile yazmaktır. –

+0

@Adam V: Ardından web servisini sadece web sayfası için arka uç olarak kullanıyorsunuz. Guy'ın istediği gibi, yanıtı web servisinden doğrudan kullanamazsınız. – Guffa

0

WebService'den görüntü çıkışı mümkün DEĞİLDİR.

Kontrol bu: http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx

+0

Bu, bir web hizmetinin nasıl görüntülendiğine bağlıdır. Bir C# web API'sini kodlayan multipart mime kullanarak bir ikili (görüntü) döndürmek mükemmel bir şekilde mümkündür. Yapıldı. Yeni başlayanlar için buna başvurun: http://en.wikipedia.org/wiki/MIME Bu, C# – Demi

+1

"Bu bir web servisinin nasıl göründüğüne bağlı olarak değişir." << Katılıyorum. – NinethSense

+0

Veya Guffa'nın yazılarında belirtildiği gibi sadece ikili dönün. :-) – Demi

0

Ayrıca, bu nasıl uyguladıklarını bağlı olarak, bir DOS saldırısı için kendinizi kurma olabileceğini unutmayın. Görüntü üretme en işlemci dostu şey değildir. Bu olası ağrı noktasını hafifletmek için bazı kimlik doğrulama ve/veya önbellek mekanizmalarının bulunduğundan lütfen emin olun.

+0

Yalnızca iç/intranet kullanımı içindir, ancak önbelleğe alma uygulanmalıdır! Teşekkürler. – Guy

1

dinamik bir görüntü sunan gerçekleştirmek için başka bir yolu vardır:

ben alfa asetatlar ve PNG ile ilgili sorunlar yaşadım. uygulanması için

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

düzenli WCF hizmeti olarak hizmet başlayın ve app.config hizmeti eklemek

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

Daha bunu yapmak parametreler iletebilirsiniz dinamik.

İlgili konular