2011-10-02 4 views
5

Tôi đang sử dụng WindowsAPICodePack, nhận hình thu nhỏ của ShellFile. Nhưng một số trong số đó trông giống như các biểu tượng chung - có một nền đen. Do đó tôi làm cho nó một Bitmap và thiết lập màu đen là minh bạch.Cách xóa màu nền của biểu tượng ShellFile "biểu tượng", nhưng không phải là hình thu nhỏ "thực"

Vấn đề là khi đó là hình thu nhỏ của ảnh - nó không nên làm. Làm thế nào tôi có thể nói một hình thu nhỏ thực sự từ một "biểu tượng"?

Mã của tôi:

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

Cảm ơn

+2

cứng để xem có bao MakeTransparent có thể hoạt động tốt trên các biểu tượng có chứa màu đen. Anyhoo, sử dụng thuộc tính FormatOption để đầu tiên chỉ yêu cầu một biểu tượng. Nếu điều đó không thành công, hãy yêu cầu một hình thu nhỏ. –

+0

@Hans a) Cảm ơn. Chính xác những gì tôi đang tìm kiếm. (nhưng trước tiên tôi yêu cầu hình thu nhỏ - luôn có biểu tượng). b) Có cách nào khác để loại bỏ màu nền không? Nếu không - tôi đoán tôi luôn có thể nhận được một biểu tượng thay vì một bitmap, bây giờ tôi biết nó sẽ không phải là một hình thu nhỏ. – ispiro

Trả lời

3

Bạn có thể tiếp cận vấn đề này từ góc độ khác. Có thể ép ShellFile.Thumbnail chỉ trích xuất ảnh thu nhỏ nếu nó tồn tại hoặc ép buộc nó trích xuất biểu tượng ứng dụng được liên kết.

Vì vậy, mã của bạn sẽ trông như thế này:

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

"lỗi có thể xảy ra với các cửa sổ gọi api vì vậy chỉ cần bỏ qua" - là thực hành tốt này? – BudBrot

+0

Bạn chỉ có thể bắt COMException với HResult 0x8004B200 như sau: 'bắt (InvalidOperationException ex) { \t COMException comException = ex.GetBaseException() là COMException; \t if (comException.ErrorCode! = Unchecked ((int) 0x8004B200)) \t \t ném; \t // VIỆC LÀM: Làm điều gì đó } ' –