2008-08-18 26 views
9

WindowsForms दुनिया में आपस्थापित बिटमैप एन्कोडर्स/डिकोडर्स (डब्ल्यूपीएफ वर्ल्ड) की सूची कैसे प्राप्त करें?

System.Drawing.ImageCodecInfo.GetImageDecoders()/GetImageEncoders() 

मेरा प्रश्न है के साथ उपलब्ध छवि एनकोडर/डिकोडर की एक सूची प्राप्त कर सकते हैं, वहाँ WPF दुनिया के लिए अनुरूप कुछ है कि मुझे उपलब्ध की एक सूची प्राप्त करने की अनुमति होगी करने के लिए एक रास्ता है

System.Windows.Media.Imaging.BitmapDecoder/BitmapEncoder 

उत्तर

0

उम्मीद है कि कोई मुझे सही कर देंगे अगर मैं गलत हूँ, लेकिन मैं वहाँ है कि WPF में ऐसा कुछ है नहीं लगता। लेकिन उम्मीद है कि यह उन कई मामलों में से एक है जहां प्रौद्योगिकी में प्रगति ने अप्रचलित तरीके से प्रस्तुत किया है जिस तरह से हम चीजों को करने के लिए उपयोग किए जाते हैं। जैसे "मैं अपनी डिजिटल घड़ी कैसे हवा करूं?"

मेरी समझ के लिए, क्यों SystemCodecInfo.GetImageDecoders() सिस्टम में आवश्यक है। ड्रॉइंग को सिस्टम की क्लूडी प्रकृति के साथ करना है। सिस्टम को निकालना: सिस्टम ड्रॉइंग जीडीआई + के आसपास एक प्रबंधित रैपर है, जो एक अप्रबंधित रैपर है Win32 एपीआई के एक हिस्से के आसपास। तो एक कारण हो सकता है कि Windows में बिना किसी नए कोडेक को .NET बिना इंस्टॉल किया जा सकेगा। और GetImageDecoders() से वापस लौटाया गया है केवल तारों का एक गुच्छा है जो आम तौर पर सिस्टम में वापस चला जाता है। ड्रॉइंग/जीडीआई +, और आपकी छवि को पढ़ने/सहेजने के लिए उपयुक्त DLL को खोजने और कॉन्फ़िगर करने के लिए उपयोग किया जाता है।

दूसरी तरफ, डब्ल्यूपीएफ में, मानक एन्कोडर्स और डिकोडर ढांचे में बनाए जाते हैं, और, यदि मुझे गलत नहीं लगता है, तो उस चीज़ पर निर्भर न करें जिसे स्थापित करने की गारंटी नहीं है ढांचा। निम्नलिखित वर्ग बिटमैपएन्कोडर से प्राप्त होते हैं और डब्ल्यूपीएफ के साथ आउट ऑफ़ द बॉक्स उपलब्ध हैं: बीएमपी बिटमैपएन्कोडर, गिफबिटमैप एन्कोडर, जेपीजी बिटमैप एन्कोडर, पीएनजीबीटममैन्कोडर, टिफ बिटमैप एन्कोडर, डब्ल्यूएमबीटमैपएन्कोडर। सभी समान प्रारूपों के लिए बिटमैप डिकोडर्स हैं, साथ ही आइकनबिटमैपडोडर और लेटबाउंड बिटमैप डिकोडर।

आप ऐसे मामले से निपट रहे हैं जो मैं कल्पना नहीं कर रहा हूं, लेकिन मुझे ऐसा लगता है कि यदि आपको बिटमैप एन्कोडर से प्राप्त कक्षा का उपयोग करना है, लेकिन WPF के साथ शामिल नहीं किया गया है, तो शायद यह आपकी खुद की कस्टम क्लास है कि आप अपने आवेदन के साथ स्थापित करेंगे।

उम्मीद है कि इससे मदद मिलती है। अगर मुझे तस्वीर का एक जरूरी हिस्सा याद आ रहा है, तो कृपया मुझे बताएं।

+1

मैं सिर्फ इस मुद्दे पर शोध कर रहा हूं, और आप गलत हैं। डब्ल्यूपीएफ इमेजिंग सिस्टम के समान ही है। ड्रॉइंग: Win32 सामान, जैसे डब्ल्यूआईसी (विंडोज इमेजिंग कंपोनेंट) के लिए एक प्रबंधित रैपर। फ्रेमवर्क में कोई एन्कोडर/डिकोडर नहीं बनाया गया है, और मुझे लगता है कि कभी नहीं होगा (प्रदर्शन और कोड पुन: उपयोग कारण, उनके पास यह सब विंडोज़ में है)। वे प्रारूपों को सूचीबद्ध करने के लिए कार्यक्षमता जोड़ने के लिए भूल गए :(। – fejesjoco

+0

पुन: "मैं अपनी डिजिटल घड़ी कैसे हवा करूं?" वे अब डिजिटल घड़ियों बनाते हैं जो बैटरी को चार्ज करने के लिए आपकी गति का उपयोग करते हैं। तो वे _could_ एक हवादार के साथ एक बनाते हैं। :) –

4

आपको .NET प्रतिबिंब से प्यार करना होगा। मैंने डब्ल्यूपीएफ टीम पर काम किया और मेरे सिर के ऊपर से बेहतर कुछ भी नहीं सोच सकता। निम्नलिखित कोड मेरे मशीन पर इस सूची का उत्पादन:

Bitmap Encoders: 
System.Windows.Media.Imaging.BmpBitmapEncoder 
System.Windows.Media.Imaging.GifBitmapEncoder 
System.Windows.Media.Imaging.JpegBitmapEncoder 
System.Windows.Media.Imaging.PngBitmapEncoder 
System.Windows.Media.Imaging.TiffBitmapEncoder 
System.Windows.Media.Imaging.WmpBitmapEncoder 

Bitmap Decoders: 
System.Windows.Media.Imaging.BmpBitmapDecoder 
System.Windows.Media.Imaging.GifBitmapDecoder 
System.Windows.Media.Imaging.IconBitmapDecoder 
System.Windows.Media.Imaging.LateBoundBitmapDecoder 
System.Windows.Media.Imaging.JpegBitmapDecoder 
System.Windows.Media.Imaging.PngBitmapDecoder 
System.Windows.Media.Imaging.TiffBitmapDecoder 
System.Windows.Media.Imaging.WmpBitmapDecoder 

जहां अतिरिक्त विधानसभाओं जोड़ने के लिए (यदि आप उदाहरण के लिए प्लग-इन का समर्थन) कोड में एक टिप्पणी है। इसके अलावा, आप को दूर करने के फिल्टर करने के लिए डिकोडर सूची चाहते हैं:

System.Windows.Media.Imaging.LateBoundBitmapDecoder 

अधिक परिष्कृत छानने का उपयोग करते हुए निर्माता पैटर्न मिलान संभव है, लेकिन मैं इसे लिखने का मन नहीं है। :-)

अब आपको केवल एन्कोडर्स और डिकोडर्स का उपयोग करने के लिए तत्काल आवश्यकता है। साथ ही, आप एन्कोडर डिकोडर्स की CodecInfo संपत्ति को पुनर्प्राप्त करके बेहतर नाम प्राप्त कर सकते हैं। यह वर्ग आपको अन्य फैक्टोइड्स के बीच मानव पठनीय नाम देगा।

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Windows.Media.Imaging; 

namespace Codecs { 
    class Program { 
     static void Main(string[] args) { 
      Console.WriteLine("Bitmap Encoders:"); 
      AllEncoderTypes.ToList().ForEach(t => Console.WriteLine(t.FullName)); 
      Console.WriteLine("\nBitmap Decoders:"); 
      AllDecoderTypes.ToList().ForEach(t => Console.WriteLine(t.FullName)); 
      Console.ReadKey(); 
     } 

     static IEnumerable<Type> AllEncoderTypes { 
      get { 
       return AllSubclassesOf(typeof(BitmapEncoder)); 
      } 
     } 

     static IEnumerable<Type> AllDecoderTypes { 
      get { 
       return AllSubclassesOf(typeof(BitmapDecoder)); 
      } 
     } 

     static IEnumerable<Type> AllSubclassesOf(Type type) { 
      var r = new Reflector(); 
      // Add additional assemblies here 
      return r.AllSubclassesOf(type); 
     } 
    } 

    class Reflector { 
     List<Assembly> assemblies = new List<Assembly> { 
      typeof(BitmapDecoder).Assembly 
     }; 
     public IEnumerable<Type> AllSubclassesOf(Type super) { 
      foreach (var a in assemblies) { 
       foreach (var t in a.GetExportedTypes()) { 
        if (t.IsSubclassOf(super)) { 
         yield return t; 
        } 
       } 
      } 
     } 
    } 
}