2011-10-02 11 views
5

मैं WindowsAPICodePack उपयोग कर रहा हूँ, ShellFile के थंबनेल के होने का नहीं ShellFile "माउस" की पृष्ठभूमि का रंग हटाने के लिए। लेकिन उनमें से कुछ जेनेरिक आइकॉन की तरह दिखते हैं - एक काला पृष्ठभूमि है। इसलिए मैं इसे बिटमैप बना देता हूं और ब्लैक को पारदर्शी के रूप में सेट करता हूं। यह ऐसा नहीं करना चाहिए -कैसे, लेकिन 'असली' थंबनेल

समस्या यह है कि जब यह एक तस्वीर का एक थंबनेल है। मैं एक "आइकन" से वास्तविक थंबनेल कैसे बता सकता हूं?

मेरे कोड:

ShellFile sf = ShellFile.FromFilePath(path); 
Bitmap bm = sf.Thumbnail.MediumBitmap; 
bm.MakeTransparent(Color.Black); 

धन्यवाद

+2

हार्ड:

तो अपने कोड कुछ इस तरह दिखेगा। Anyhoo, पहले प्रारूप के लिए पूछने के लिए FormatOption प्रॉपर्टी का उपयोग करें। अगर यह विफल रहता है, तो थंबनेल के लिए पूछें। –

+0

@ हंस ए) धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। (लेकिन पहले मैं थंबनेल के लिए पूछता हूं - हमेशा एक आइकन होता है)। बी) क्या पृष्ठभूमि रंग से छुटकारा पाने का कोई और तरीका है? यदि नहीं - मुझे लगता है कि मैं हमेशा बिटमैप के बजाय आइकन प्राप्त कर सकता हूं, अब मुझे पता है कि यह थंबनेल नहीं होगा। – ispiro

उत्तर

3

आप किसी अन्य कोण से इस समस्या को संपर्क कर सकते हैं। शेलफाइल को मजबूर करना संभव है। थंबनेल चित्र को निकालने के लिए थंबनेल केवल मौजूद है या इसे संबंधित एप्लिकेशन आइकन निकालने के लिए मजबूर करना है। देखने के लिए कैसे MakeTransparent प्रतीक है कि काले होते हैं पर अच्छी तरह से काम कर सकते हैं

Bitmap bm; 
using (ShellFile shellFile = ShellFile.FromFilePath(filePath)) 
{ 
    ShellThumbnail thumbnail = shellFile.Thumbnail; 

    thumbnail.FormatOption = ShellThumbnailFormatOption.ThumbnailOnly; 

    try 
    { 
     bm = thumbnail.MediumBitmap; 
    } 
    catch // errors can occur with windows api calls so just skip 
    { 
     bm = null; 
    } 
    if (bm == null) 
    { 
     thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly; 
     bm = thumbnail.MediumBitmap; 
     // make icon transparent 
     bm.MakeTransparent(Color.Black); 
    } 
} 
+1

"विंडोज़ एपीआई कॉल के साथ त्रुटियां हो सकती हैं तो बस छोड़ें" - क्या यह अच्छी प्रथा है? – BudBrot

+0

आप इस तरह HRESULT 0x8004B200 के साथ ही एक COMException पकड़ कर सकते हैं: 'पकड़ (InvalidOperationException पूर्व) { \t COMException comException = ex.GetBaseException() COMException के रूप में; \t अगर (comException.ErrorCode! = अनचेक ((int) 0x8004B200)) \t \t फेंक; \t // TODO: कुछ करें } ' –

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