वहाँ ASP.NET वेब एपीआई का उपयोग कर एक छवि को वापस करने के लिए एक अनुशंसित तरीका है


86

2 मापदंडों के साथ एक छवि को वापस करने का सबसे अच्छा तरीका क्या है (आकार और आकार के लिए x)।

उदाहरण के लिए

~/api/image12345/200/200

200 से 200 jpg / png / या gif लौटाएगा

क्या मुझे एक System.Drawing.Imageवस्तु वापस करनी चाहिए या मैन्युअल रूप से परिभाषित करना चाहिए HTTPReponseMessage.Content?


यहाँ पर मेरे उत्तर की जाँच करें: stackoverflow.com/a/20888749/64334
रॉनी ओवरबाय

जवाबों:


147

आपको System.Drawing.Imageतब तक वापस नहीं लौटना चाहिए , जब तक कि आप एक फॉर्मेटर भी नहीं जोड़ते हैं जो जानता है कि कैसे उचित बाइट्स में परिवर्तित करना है, जैसा कि आप उम्मीद करते हैं कि छवि बाइट्स के रूप में खुद को क्रमबद्ध नहीं करती है।

एक संभव उपाय यह है HttpResponseMessageकि इसकी सामग्री में संग्रहीत छवि के साथ वापस लौटा जाए (जैसा कि नीचे दिखाया गया है)। याद रखें कि यदि आप प्रश्न में दिखाया गया URL चाहते हैं, तो आपको एक मार्ग की आवश्यकता होगी जो {imageName}, {width} और {height} मापदंडों को मैप करता हो।

public HttpResponseMessage Get(string imageName, int width, int height)
{
    Image img = GetImage(imageName, width, height);
    using(MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(ms.ToArray());
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");

        return result;
    }
}

लेकिन फिर से, यदि आप कई स्थानों पर ऐसा कर रहे हैं, तो फ़ॉर्मेटर मार्ग पर जाना "अनुशंसित" तरीका हो सकता है। प्रोग्रामिंग में लगभग सब कुछ के रूप में, उत्तर आपके परिदृश्य पर निर्भर करेगा।


क्या छवि का उपयोग करने में भी होना चाहिए?
dibs487

GetImageविधि कहां है ?
योदा

1
@ यह आपके कार्यान्वयन का तरीका है जो उस छवि को लौटाएगा जिसे क्लाइंट को वापस स्थानांतरित करने की आवश्यकता है।
कार्लोसफैजीरा

यदि आप हार्ड ड्राइव से फाइल लौटा रहे हैं, तो मुझे लगता है कि फाइलस्ट्रीम का उपयोग करना बेहतर प्रदर्शन होगा, इस तरह (इस प्रश्न में स्वीकृत उत्तर देखें): stackoverflow.com/questions/11125535/…
जॉन गिलमर

19

छवियाँ भारी हैं। ASP.NET WebForms, HttpHandlers, MVC, और Web API सभी स्थिर फ़ाइलों की सेवा करने का एक बहुत ही भयानक काम करते हैं। IIS बहुत अच्छा काम करता है - अक्सर 20-100x अधिक कुशलता से।

यदि आप अच्छा प्रदर्शन प्राप्त करना चाहते हैं, तो नवीनतम पर URL पुनर्लेखन करें , तो PostAuthorizeRequest के दौरान , ताकि IIS फ़ाइल को उठा सके और उसकी सेवा कर सके। हां, इसका अर्थ है HttpModule- स्तर ईवेंट हैंडलिंग।

[अस्वीकरण: मैं निम्नलिखित लेख और ओपन-सोर्स प्रोजेक्ट का लेखक हूं]

यदि आप छवियों के साथ कुछ गतिशील कर रहे हैं, तो बचने के लिए छवि प्रसंस्करण नुकसान पर इस लेख को देखें , और ImageResizer पर एक नज़र डालें । इसमें उत्कृष्ट डिस्क कैशिंग (जो IIS स्टैटिक फाइल हैंडलिंग का उपयोग करता है) है, और किसी भी प्रकार की छवि निर्माण से जुड़ना आसान है। यदि आपको उन्नत करने की आवश्यकता है, तो इसके लिए AForge, FreeImage और WIC के साथ वैकल्पिक बाइंडिंग हैं।


2
मैं अपने प्रोजेक्ट में ImageResizer का उपयोग कर रहा हूं और इस बात से बहुत खुश हूं कि यह कैसे काम करता है - मेरे अलावा। केवल ग्रिप कुछ दस्तावेज़ीकरण को अद्यतन करने की आवश्यकता है।
जॉन एल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.