2011-12-10 44 views
4

我想設置一個圖像有一個透明的背景,但我不想用透明度替換一個特定顏色的所有像素。如何在不使用Bitmap.MakeTransparent()的情況下將圖像設置爲在C#中具有透明背景?

更具體地,該圖像是一個文件夾,通過IShellItemImageFactory.GetImage獲得的縮略圖圖像。這給了我一個位圖,如Windows資源管理器縮略圖視圖中所顯示,但背景是純白色的。

我可以用它Bitmap.MakeTransparent,而且在大多數情況下工作,但在縮略圖中包含白色本身的任何情況下(例如,包含圖像的文件夾,其中包括白兩種顏色)。

順便說一句,這是超過10年作爲一個開發者第一次,谷歌上搜索我的問題後,我還沒有找到答案的任何地方,我實際上已經不得不問我自己。 (我想這意味着我只是剷平了!yippee的,我現在是一個2級開發者...)

+0

可能這可以幫助你:http://www.c-sharpcorner.com/UploadFile/mahesh/DrawTransparentImageUsingAB10102005010514AM/DrawTransparentImageUsingAB.aspx –

+0

你想去哪裏來顯示圖像(如,一個TreeView,按鈕... )?你是什​​麼意思*,但在任何情況下,縮略圖圖像包含白色*? –

+0

我已經編寫了一個圖像查看器應用程序,並在我的用戶控件的flowlayoutpanel中顯示縮略圖。當鼠標移過縮略圖時,我繪製一個漸變填充背景(不同的顏色取決於所選或熱點)。問題是,如果文件夾縮略圖圖像中包含白色,那麼該部分現在(不正確)是透明的,並且我的縮略圖繪製處理程序將使用漸變來繪製圖像的該部分(如預期的那樣,因爲圖像「說」該部分是透明的)。我希望現在清楚了嗎? –

回答

1

使用洪水填充算法從外面填補了相同顏色的像素,因爲你需要它。這是類似於Photoshop中的魔杖。

http://en.wikipedia.org/wiki/Flood_fill

我會做的是一些不起眼的顏色(品紅色總是這樣對我來說)洪水填充,然後替換用透明彩色(我不知道,如果洪水填充與透明像素是可行的)。

+0

如果圖像的邊界上有白色像素,則會失敗。例如,看看NBA徽標:http://upload.wikimedia.org/wikipedia/en/0/07/NBALogo.svg –

+0

這聽起來像是一個很好的解決方案。如果你的回答是正確的,我會嘗試一下並更新! (有沒有白色像素的邊界上,據我所看到。而如果在極少數情況下,這將是不差那Bitmap.MakeTransparent反正。) –

+0

如果圖像被剪切只是它不會失敗紅色和藍色區域的邊緣,但我說OP無論如何都沒有那種圖像。 –

1

那麼你從IShellItemImageFactory.GetImage得到的是包含在白色背景上的原始圖像的合成圖像?如果圖像不具有與縮略圖大小相同的縱橫比,我懷疑是否有白色背景。例如,如果您要求640x480圖像的96x96縮略圖,頂部和底部會出現一些空白區域。

如果是這樣的話,你有問題。您無法區分圖像中包含的白色像素和由GetImage添加的白色像素。

有幾件事你可以做。您可以加載圖像並自行調整大小。這可能是最簡單的。那麼你會想維護自己的縮略圖緩存。

或者你可以檢查由GetImage返回來尋找對雙方的白色空間中的圖像。基本上,如果行(或列)上的每個像素都是白色的,那麼使該行(或列)透明。這比這更復雜一點(例如,the NBA logo)。但這基本上是你想要做的。

+0

嗯......我希望自己可以加載圖像並重新調整它。那會更簡單!但這是*文件夾*縮略圖。即它由殼產生的。另外,我問殼體256-256的圖像;據我所知,縮略圖是由shell維護的大小。其實,我想知道我傳遞給GetImage的標誌是否正確。的代碼的相關行是:HRESULT HRES =((IShellItemImageFactory)PPSI).GetImage(新SIZE(256,256),SIIGBF.SIIGBF_BIGGERSIZEOK | SIIGBF.SIIGBF_RESIZETOFIT,出HBITMAP); –

+0

@Jerome:這有助於調用帶有顏色參數的'MakeTransparent'重載嗎?對於我來說,如果您試圖消除256x256圖像中可能的邊框,或者您想要消除(使透明)背景的某些部分,我不清楚。如果你想消除自己的背景,使透明部分醜惡的東西(像'Color.Lime'),然後調用'MakeTransparent(Color.Lime)'。 –

+0

謝謝,但解決與洪水填充。雖然要回答你的問題。我試圖消除周圍的實際外殼縮略圖位圖圖像的白邊(或黑色邊框,如果我用標誌參數外殼圖像提取方法擺弄)。因此,即使是接受顏色的MakeTransparent過載仍然會有同樣的問題:它會從圖像中消除*全部*白色像素,從而在圖像內部創建透明的「洞」。 –

相關問題