2012-06-23 79 views
1

目前我正在研究一個讓我以圖像形式處理數據的程序。 假設我有與圖像對應的數據點(可能是300 x 300),值的範圍是0到10000,我想用灰色值顯示圖像。如果我將數值範圍(0-10000)分成256塊,並按照位圖格式(我使用rgb將所有顏色設置爲相等)的灰度值進行分配,那將會很好。從double創建位圖[]

但是,用戶必須能夠改變對比度和亮度。我的意思是: 假設對應於黑色的值是3000(顯然以下所有值都是黑色),而對應於白色的值是5000+。兩者之間的值應該對灰色有線性依賴關係。用戶將擁有兩個滑塊,一個用於更改可觀察值的範圍(在本例中爲2000),另一個用於將範圍從3000-5000改爲5000-7000。 問題實際上是使滑塊實時工作。我試圖用一個矩形來模擬每個像素的圖像,但是在所有矩形中循環並且改變它們的顏色太簡單了。 有沒有人有任何想法,如何使它工作很好,順利?

+0

'WritableBitmap' – CodesInChaos

+0

我希望瞭解更多信息。究竟是什麼讓我做? – phil13131

回答

2

首先,您需要將double值的數組轉換爲byte值的數組。然後,您可以將這個byte值的數組寫入WriteableBitmap。如果您不需要反覆更新WriteableBitmap的內容,你也應該凍結它來提高性能:

public static ImageSource GetImage(byte[] rawImageBytes, int width, int height) 
{ 
    int channels = 1; 
    int stride = width * channels; 
    var image = new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray8, null); 
    image.WritePixels(new Int32Rect(0, 0, width, height), rawImageBytes, stride, 0); 
    image.Freeze(); 
    return image; 
} 

如果您想更新WriteableBitmap的內容,你可以調用WritePixels在同實例不凍結對象實例。

要在您的WPF應用程序中顯示WriteableBitmap,只需將其分配給Image控件的Source屬性。

+0

感謝您的回答!我會盡快嘗試並說出它是如何發生的。我認爲可能存在的問題是如果圖像的大小太大,則將double數組轉換爲字節數組。 – phil13131

+0

完美地工作,謝謝!刷新率非常高,我可以輕鬆完全重新計算並刷新500 x 500像素的圖像,每秒大約10次,而不會有任何滯後。 – phil13131