【问题标题】:Efficient storage of binary image data高效存储二值图像数据
【发布时间】:2011-03-29 20:06:03
【问题描述】:

我想在 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 如果有另一种方法可以有效地存储和快速获取/设置一组二进制图像,我会全力以赴。

【问题讨论】:

  • 您能否解释一下“与在 HashMap 中查找一样快”的意思?
  • 在我的应用程序过程中,我必须实时访问这些图像。 HashMap 允许我这样做。如果从 byte[] 到 vtkImageData 的转换不是实时的,那么这将不起作用。

标签: java image binary


【解决方案1】:

有这样的感觉:

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

然后

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

【讨论】:

  • 我很困惑,我有一个 512*512*256(图像大小)的 byte[],我不确定您的答案是否适合我的问题。
  • 所以你迭代字节数组的方式和现在一样;对此无能为力。我的方法为您节省了每个字节移位 8 次的需要。
  • 我明白了。这似乎是获取位值的方法,设置位值的命令是什么?
  • targetByte |= MASKS[imageIndex]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2012-10-23
  • 2021-07-31
  • 1970-01-01
  • 2011-02-10
  • 2017-07-04
相关资源
最近更新 更多