2009-05-20 12 views
11

के साथ पीएनजी छवि बनाएं, मैं <img src="myws.ashx?x=100> एचटीएमएल तत्व से बुलाए गए छवि को उत्पन्न करने के लिए एक सी # वेब आधारित सेवा का उपयोग करके एक लाल वर्ग के बारे में एक लाल पीएनजी छवि बनाने में सक्षम होना चाहता हूं।सी # एचटीपीएचंडलर webservice

कुछ उदाहरण HTML:

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

वहाँ है किसी को भी साथ बुरा काम कर सकते हैं एक सरल (कार्य) सी # वर्ग सिर्फ पाने के लिए मुझे शुरू कर दिया है? एक बार बंद होने और जाने के बाद मुझे यकीन है कि मैं इसे वास्तव में करने के लिए इसे समाप्त कर सकता हूं जो मैं करना चाहता हूं।

  • अंत खेल सरल लाल/पीला/ग्रीन (आरएजी) एम्बेडेड स्थिति एक डेटा पर ही आधारित वेब पेज है कि प्रदर्शन मेट्रिक्स आदि * चलता के लिए मार्कर बनाने के लिए है
  • मैं इसे के रूप में मैं का उपयोग कर आशा पीएनजी का उपयोग करना चाहते हैं भविष्य * में पारदर्शिता
  • ASP.NET 2.0 सी # समाधान कृपया ...

तिया

समाधान (मैं एक उत्पादन 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;} 
    } 
} 
+0

क्या आप एक http हैंडलर को एक छवि वापस कर सकते हैं? चलिए एक बिटमैप छवि या बाइट [] बफर को एक सी # विधि (फ़ाइल के पीछे कोड) कहां से कहें कहां से कहा जाता है? मुझे खेद है अगर मैं stupipd लगता है लेकिन मैं http हैंडलर – zack

+0

@YP के लिए नया हूँ, स्वीकृत उत्तर देखें ?? अन्यथा मैं समझ नहीं पा रहा हूं कि आपका क्या मतलब है और स्पष्ट रूप से, मुझे नहीं पता कि वैसे भी इसे कैसे किया जाए। मेरा सी # ब्लीह है! – Guy

+0

@guy समाधान पोस्ट करने के लिए धन्यवाद - मुझे बहुत मदद की! –

उत्तर

20

वेब सेवाओं, विशेष रूप से सोप में कॉल के विवरण के साथ एक एक्सएमएल लिफाफा जैसी चीजों की उम्मीद आप एक 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 पर होवर करेगा और "इस इंटरफ़ेस को कार्यान्वित करें" का चयन करें। यह कुछ ऐसा है: सार्वजनिक बूल IsReusable {get {return true; }} – Lloyd

+0

धन्यवाद - इसे मिला! Response.ContentType और ImageFormat.Png पर भी मामूली टाइपो अब इसे कुछ/कुछ खींचने के लिए प्राप्त करने की आवश्यकता है ... – Guy

+1

कैशिंग के लिए मैंने आपको उल्लेख किया है कि आप HttpRuntime.Cache का उपयोग कर सकते हैं, बस बाइट डंप करें [] वहां मेमोरीस्ट्रीम से वापस आएं। – Lloyd

3

एक वेब सेवा इस के लिए उपयुक्त नहीं है। यह एक विशिष्ट प्रारूप में एक संदेश देता है, आमतौर पर 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); 
+0

एकमात्र परिवर्तन मैं इसे एक सामान्य हैंडलर (.ashx फ़ाइल) का उपयोग करना चाहता हूं। सभी पेज (.aspx) ओवरहेड की कोई ज़रूरत नहीं है। – Keltex

+0

वेब सेवा के माध्यम से ऐसा करना वास्तव में संभव है; मैं इसे पीडीएफ के साथ करता हूं। कुंजी इसे बाइट सरणी के रूप में वापस करने के लिए है, इसे दूसरे छोर पर पुन: स्थापित करें, और उसके बाद उचित सामग्री प्रकार के साथ इसे लिखें। –

+0

@ एडम वी: फिर आप वेब पेज के लिए वेब सेवा का उपयोग केवल वेब सेवा के रूप में कर रहे हैं। जैसा कि लड़के ने पूछा था, आप सीधे वेब सेवा से प्रतिक्रिया का उपयोग नहीं कर सकते हैं। – Guffa

0

वेब सेवा से छवि आउटपुट करना संभव नहीं है।

चेक करें: http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx

+0

यह इस बात पर निर्भर करता है कि कोई वेब सेवा कैसे देखता है। सी # वेब एपीआई के माध्यम से मल्टीपार्ट माइम एन्कोडिंग का उपयोग करके बाइनरी (छवि) को वापस करना पूरी तरह से संभव है। ये कर दिया गया है। इसे स्टार्टर्स के लिए देखें: http://en.wikipedia.org/wiki/MIME यह सी # – Demi

+1

में करना बहुत चुनौतीपूर्ण नहीं है "यह इस बात पर निर्भर करता है कि कोई वेब सेवा कैसे देखता है।" << मैं सहमत हूं। – NinethSense

+0

या गुफा के पोस्ट में उल्लिखित बाइनरी लौटें। :-) – Demi

0

इसके अलावा, आप यह कैसे लागू पर निर्भर करता है, ध्यान रखें कि आप अपने आप को स्थापित करने के किया जा सकता है एक डॉस हमले के लिए भी ध्यान रखें। छवियां उत्पन्न करना सबसे प्रोसेसर अनुकूल चीज़ नहीं है। इस संभावित दर्द बिंदु को कम करने में मदद के लिए कृपया कुछ प्रमाणीकरण और कैशिंग तंत्र सुनिश्चित करें।

+0

यह केवल आंतरिक/इंट्रानेट उपयोग के लिए है, लेकिन कैशिंग को लागू करना होगा! धन्यवाद। – Guy

2

मुझे लगता है कि @ लॉयड का जवाब एक अच्छी शुरुआत है। Can you make an alpha transparent PNG with C#?

+0

हा! मैं पिछले घंटे के लिए आपके प्रश्न का अध्ययन कर रहा हूं।अगर मैं बस कुछ "सरल सामान" प्राप्त कर सकता हूं तो मुझे यकीन है कि मैं इसे अपने खाली सी # ज्ञान के साथ भी समाप्त कर सकता हूं। – 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(); 

आप मापदंडों इसे और अधिक करने के लिए पारित कर सकते हैं गतिशील।

संबंधित मुद्दे