2011-03-29 2 views
0

동등한 크기의 큰 3D 이진 이미지를 Java로 많이 저장하려고합니다. 나의 현재의 생각 과정은 바이트의 각 비트에 정보를 저장하는 것이다. 따라서 한 이미지의 공간에서 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 []를 반복하지 않고 byte []에있는 모든 원소의 n 번째 비트를 얻으시겠습니까? 이상 적으로는 HashMap (현재 사용하고있는 것)에서 조회를 빨리 얻고 싶습니다.

감사

PS 효율적 이진 이미지의 집합을 저장하고 신속하게 얻을/설정하는 또 다른 방법이 있다면, 나는 모든 귀 해요.

+0

당신이 "는 HashMap에 최대한 빨리 조회"에서하십시오 무슨 뜻인지 명확히 수 있을까? –

+0

신청 과정에서이 이미지에 실시간으로 액세스해야합니다. HashMap을 사용하면이 작업을 수행 할 수 있습니다. byte []에서 vtkImageData 로의 변환이 실시간이 아니면이 방법은 작동하지 않습니다. – Jon

답변

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

+0

그러면 바이트 배열을 반복 할 때와 같은 방법으로 처리 할 수 ​​있습니다. 그걸 도울 수 없어요. 내 접근 방식은 모든 바이트에 대해 8 번 비트를 이동해야 할 필요성을 없애줍니다. – iluxa

+0

나는 본다. 이것은 비트 값을 얻는 방법 인 것 같습니다. 비트 값을 설정하는 명령은 무엇입니까? – Jon

관련 문제