2008-09-18 51 views
1

C#問題(.net 3.5)。我有一個類ImageData,它有一個字段ushort [,]像素。我正在處理專有的圖像格式。 ImageData類在構造函數中獲取文件位置,然後打開文件擴展名以確定如何解碼。在幾個圖像文件中,標題中有一個「位深度」字段。在解碼頭部之後,我將像素值讀入「pixels」數組中。到目前爲止我沒有超過16bpp,所以我沒事。但是如果我有32bpp呢?C#'通用'類型問題

我想要做的是在運行時確定像素的類型。我想在讀取頭部的位深度並將像素數據複製到內存之前執行此操作。有任何想法嗎?

回答

1

歸結你的問題,你希望能夠有一類具有USHORT [,]像素場(每像素16位)有時和UINT32 [,]像素場(32一些像素)。有幾種不同的方法來實現這一點。

您可以通過使用32位和16位子類的Pixel類,在wazoo上重寫各種操作符來創建ushort/uint32的替代品,但這會產生大量開銷,很難得到正確的甚至更難以確定它的權利。或者,您可以爲像素數據創建代理類(它將包含ushort [,]或uint32 [,]數組,並且將具有所有必要的訪問器)。不利的一面是,您可能最終會在ImageData類中產生大量特殊情況代碼,這些代碼根據某些16位/ 32位模式標誌以某種方式執行。

我認爲更好的解決方案是將ImageData分類爲16位和32位類,並使用工廠方法創建實例。例如。 ImageData是基類,ImageData16bpp和ImageData32bpp是子類,靜態方法ImageData.Create(string imageFilename)是根據標題數據創建ImageData16bpp或ImageData32bpp的工廠方法。例如:

public static ImageData Create(string imageFilename) 
{ 
    // ... 
    ImageDataHeader imageHeader = ParseHeader(imageFilename); 
    ImageData newImageData; 
    if (imageHeader.bpp == 32) 
    { 
     newImageData = new ImageData32(imageFilename, imageHeader); 
    } 
    else 
    { 
     newImageData = new ImageData16(imageFilename, imageHeader); 
    } 
    // ... 
    return newImageData; 
} 
2

我會說不要在建造者那裏做這項工作 - 在我看來,建造者不應該做太多的工作。使用工廠方法讀取文件以確定位深度,然後讓它構造類的正確泛型,並將其返回。

0

讓解碼函數返回一個Array類型的對象,它是所有數組的基類。然後,關心該類型的人可以做「如果(a是ushort [,])」等等,如果他們想要通過像素。如果你這樣做,你需要在ImageData中分配數組,而不是相反。

或者,調用者可能知道他們希望您使用哪種像素陣列。即使它是8bpp或16bpp的圖像,如果你將它解碼爲32bpp的屏幕,你需要使用uint而不是ushort。所以你可以編寫一個ImageData函數,它將解碼爲任何類型T的整數。

問題的根源在於你不知道如何決定你想要什麼樣的輸出格式。你需要首先弄清楚,程序語法第二。