2011-03-29 57 views
0

我想用Java存儲大量大小相同的大型3D二進制圖像。我目前的思考過程是將信息存儲在字節[]的每個位中。因此,在一幅圖像的空間中,我可以有效地存儲8幅圖像(每比特一幅圖像)。我有以下循環來獲取/設置圖像數據。二進制圖像數據的有效存儲

final byte[] storedArray = organData.get(imageNumber); 
final short[] binaryArray = getArray(binaryOrgan); 

int i=0; 
for (short binaryData : binaryArray) { 
    byte storedData = (byte)storedArray[i]; 
    if (binaryData == 0) 
     storedData &= ~(1 << bitNumber); 
    else 
     storedData |= (1 << bitNumber); 
    storedArray[i] = storedData; 
    ++i; 
} 

獲取

final byte[] storedArray = organData.get(imageNumber); 
final short[] binaryArray = getArray(binaryImage); 

int i=0; 
for (short storedData : storedArray) { 
    binaryArray[i] = (short)((storedData >> bitNumber) & 1); 
    ++i; 
} 

目前這些工作正常但是它們速度過慢。有沒有辦法加快這一點?例如,只需獲取byte []中每個元素的第n位而不需要迭代byte []?理想情況下,我希望能像在HashMap中查找一樣快(這是我目前使用的)。

感謝

PS如果有另一種方式來有效地存儲和快速獲取/設置一組二進制圖像,我所有的耳朵。

+0

你能否澄清你所說的「以最快的速度HashMap中的查找」是什麼意思嗎? – 2011-03-29 20:14:16

+0

在我的應用程序過程中,我必須實時訪問這些圖像。 HashMap允許我這樣做。如果從byte []到vtkImageData的轉換不是實時的,那麼這將不起作用。 – Jon 2011-03-29 21:42:34

回答

1

有水木清華這樣的:

private static final int MASKS[] = new int[] { 
1, 2, 4, 8, 16, 32, 64, 128}; 

然後

int imageIndex; 
boolean colorSet = (yourByte & MASKS[imageIndex]) != 0; 
+0

我很困惑,我有一個字節[]是512 * 512 * 256(圖像的大小),我不確定你的答案如何符合我的問題。 – Jon 2011-03-29 21:43:50

+0

所以你可以像現在一樣迭代字節數組。對此無能爲力。我的方法可以節省您爲每個字節移位8次的需求。 – iluxa 2011-03-29 21:45:59

+0

我明白了。這似乎是得到一個位值的方法,設置一個位值的命令是什麼? – Jon 2011-03-29 22:10:25

相關問題