2011-11-14 91 views
3

WPF是否與此相當?設置WPF ImageSource的透明度(相當於GDI Matrix33 = 0.5f)?

ImageAttributes ia = new ImageAttributes(); 
ia.SetColorMatrix(new ColorMatrix { Matrix33 = 0.5f }, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 

換句話說,我可以調整一個WPF的ImageSource(或任何其他相關的繪圖類例如BitmapImage的)的透明度,或者是GDI的最佳選擇這裏?

我不打算將圖像繪製到一個窗口,所以我認爲,排除了使用Image類(?)

(我有嘗試使用,而不是GDI WPF的思路主要是因爲我的印象是,WPF我可以有硬件加速,但從我目前看到的,似乎它只適用於圖像操作的一個非常有限的子集)

回答

0

追隨你的意見,我創建了一個示例項目,該項目可以修改阿爾法做渠道快速使用WriteableBitmapEx作爲基礎,並上傳到我的Company Blog。你將不得不原諒格式,它是一個新的網站,仍然有一些小問題需要解決!下載鏈接是名爲BitmapAlphaChannel

你在說WPF的硬件加速僅適用於功能的有限子集正確的頁面上。例如,所有佈局都是在CPU上完成的,在CPU上鑲嵌細分,只有最終渲染在GPU上完成。結果是我的經驗中WPF比GDI +,肯定是GDI慢。然而,它可以按照正確的方向按照你想要的速度去做你想要的東西!

+0

似乎很好,歡呼:) – unrelativity

+1

鏈接已死:( –

+0

對不起,該網站不存在了,我建議看看http://writeablebitmapex.codeplex.com/樣本。 –

0

圖像有一個opacity字段,這是在1.0(完全不透明)的值爲0.0(不可見)

例如:

<Image 
Height="107" 
Margin="367,0,473,83" 
Source="Images/4.png" 
Stretch="Fill" 
    VerticalAlignment="Bottom" Opacity="0.5"/> 
+0

但就是不要讓這種形象回到我的東西可以,比如保存的唯一途徑,就是通過像一個RenderTargetBitmap?這不涉及不透明度的損失嗎? – unrelativity

2

退房WriteableBitmapEx,其提供用於與WPF和Silverlight存儲器操縱位圖的一組擴展方法。

WPF本身沒有任何東西可以讓你做到這一點,但WPF/Silverlight類WriteableBitmap提供了一個快速,低級的API來繪製/操作,並且是WPF原生的。

WriteableBitmapEx然後通過提供擴展方法做GDI般的操作建立在此。有一個Convolute函數可以將圖像與矩陣進行卷積運算,因此您可以執行上述操作。注意WB-Ex是一個silverlight庫,但它們也提供了一個未維護的WPF版本,雖然它不完整,但可以擴展到與Silverlight版本保持同步。

除此之外,我建議滾動自己。如果你希望做的是改變不透明度爲0.5F然後,而不是卷積我建議寫一個特定的功能基於上面的例子

+0

我無法弄清楚如何從這些卷積方法中將方法移植到WPF上,所以我給了'ForEach'方法從[here](http://writeablebitmapex.codeplex.com/SourceControl/changeset/view/82092#1765208),並發現它比使用GDI慢得多 - 並且該方法也使用不安全的代碼!我試圖看看是否可以使用WPF進行這樣的操作,因爲它具有硬件加速功能,但現在看起來它只適用於Visuals之類的東西......如果沒有更好的選擇,我想我只需要使用GDI 。 – unrelativity

+0

我不知道,我有WriteableBitmapEx做一些相當快的操作。你到底在想什麼?被建議相當多的擴展有一個Bitmap.Lock()之前和之後,這是一個緩慢的操作。 以該庫中的代碼爲起點,您是否考慮過按照步驟4對像素(來自不安全的指針)進行迭代並修改結果?原因是BGRA格式的圖像將每四個字節等於一個alpha通道字節。這可能非常快。 –