2011-03-29 68 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

相关问题