2012-01-19 22 views
1

我有一個設計問題...實現高效的圖像類

我想創建一個名爲EfficientImage我自己的形象類,其中將包括一個負載,將採取System.Drawing.Bitmap,並使用鎖位轉換它變成一個二維字節數組。

class EfficientImage 
{ 

    private byte[,] image; 
    private int width; 
    private int height; 

    public Load(System.Drawing.Bitmap inImage) 
    { 
    } 

    //etc... 

} 

所以我可能

EfficentImage ef = new EfficientImage(); 
ef.Load(myBitmap); 

什麼是訪問對象中的圖像陣列不失首先使用LockBits的性能增益的最佳方式?我相信有一個訪問器或一個屬性會複製GetPixel/SetPixel在一個普通的Bitmap對象中,效率不高,並且將映像字段設置爲public會破壞封裝。

這可能是這種設計完全是錯誤的但我會很樂意學習更好/正確的方法。

感謝您的幫助

+0

只是好奇,現有的圖像類是什麼效率低下,你在你提出的類中解決?或者這只是一個學習練習? – Mikeb

+0

更多的學習鍛鍊的是誠實,也使我能夠把任何東西我學其他問題 – TomP89

回答

3

我假設你想要某種過濾器適用於圖像,或者有一些其他類型的可修改多個像素的處理。

如果是這樣的話,我會打電話給你的類像ImageFilter,例如:

public abstract class ImageFilter 
{ 
    protected abstract void ApplyFilter(byte[,] imageData); 

    public Bitmap Apply(Bitmap image) 
    { 
     // lockbits etc 
     ApplyFilter(imageData); 
     // unlockbits 
    } 
} 

public class MyFilter : ImageFilter 
{ 
    protected override ApplyFilter(byte[,] imageData) 
    { 
     // work on the bits 
    } 
} 

Bitmap newBitmap = new MyFilter().Apply(oldBitmap); 

這樣,你可以寫一個只與原始數據處理自定義過濾器,而ImageFilter抽象類交易加載圖像及其數據。

道歉,如果我錯過了這一點:)

+0

感謝您的回答,我真的很喜歡這一點,但是我的情況是,我要創建一個從Form類Image對象所以我無法繼承Image基類。你能想到任何方式嗎? – TomP89

+0

從'ImageFilter'繼承的過濾器(如'MyFilter')是你創建新類,並從內部'Form'您可以創建這樣一個過濾器的新實例和應用'()'它'任何Image'你碰到過。 –

+0

是的,感覺很抱歉。謝謝你的幫助! – TomP89