2013-07-23 5 views
2

임베디드 카메라 (datasheet here)에서 80 x 60 해상도의 16 비트 컬러 이미지를 얻으려고합니다. 카메라에서 9600 (80 * 60 * 16/8) 바이트를 성공적으로 가져올 수 있지만 이미지를 표시하는 데 문제가 있습니다.안드로이드 16 비트 컬러 이미지를 비트 맵으로

bm = Bitmap.createBitmap(80, 60, Bitmap.Config.RGB_565); 
bm.copyPixelsFromBuffer(ByteBuffer.wrap(jpegBytes)); 

jpegBytes 이미지의 바이트의 배열이며 9600 바이트 길이 : 나는 비트 맵으로 바이트 배열을 변환하려면 다음 코드를 사용하고 있습니다. 다음과 같이

지금, 나는 점점 오전 이미지 : 시간의

corrupted image

99 %. 그러나, 나는 다음과 같이 손상되지 않은 이미지를 얻을 수 있어요 없습니다 :

uncorrupted image

를 매우 드물게. 왜 이런 일이 일어나고 있는지에 대한 제안은 누구에게 있습니까? 정말 고마워!

UPDATE : 모든 픽셀이 올바른 자리에 있지만 자신의 RGB 값이 혼합 가지고있는 것처럼

보인다. 예를 들어, 두 사진 사이의 흰색 부분은 RGB의 순서가 흰색을 얻는 데 중요하지 않기 때문에 동일합니다. 그러나, 색상이 빨간색 의자가 손상된 이미지에서 파란색으로 게재하고 파란색 배낭 비트 맵 설정으로 사용 Config.ARGB_8888 손상된 이미지

+0

이미지 구조가 정확하지만 색상이 꺼져있는 것 같습니다. 이미지가 항상 RGB_565 형식으로되어 있다고 확신합니까? 또한, 이미지 데이터가 raw 픽셀인지 (jpeg 인코딩이 아닌) 확신합니까? –

+0

카메라의 데이터 시트에 따르면 이미지는 RGB_565 형식으로 전송되어야합니다. 카메라에서 4 비트 및 8 비트 회색 음영 이미지를 가져와 ARGB_8888을 사용하여 표시 할 수 있었지만 ARGB_8888을 사용하여 16 비트 이미지를 표시하면 응용 프로그램이 충돌합니다. 이는 ARGB_8888에 필요한 픽셀 당 4 바이트가 아니라 16 비트 이미지에 픽셀 당 2 바이트가 있기 때문입니다. –

+0

바이트 순서 문제 일 수 있습니다. bm.copyPixelsFromBuffer (ByteBuffer.wrap (jpegBytes) .order (ByteOrder.LITTLE_ENDIAN));)를 사용하면 어떻게됩니까? –

답변

1

녹색으로 게재되기 때문에 혼합되는 것이 분명하다

public static final Bitmap.Config RGB_565 용 문서에서 : 6 비트로 저장 녹색 된다 레드 정밀도의 5 비트 (32 개 개의 가능한 값)에 저장된다

각 화소는 2 바이트에 저장 만 RGB 채널 부호화 정밀도 (64 개의 가능한 값) 및 파란색은 입니다. 5 비트 정밀도로 저장됩니다. 이 구성은 소스 구성에 따라 약간의 시각적 결함을 생성 할 수 있습니다. 인스턴스의 경우 디더링을 사용하지 않으면 결과에 녹색 음영이 표시 될 수 있습니다. 에 더 나은 결과를 얻으려면 디더링을 적용해야합니다. 이 구성은 색조가 불투명 한 불투명 비트 맵을 사용할 때 유용합니다.

+0

버퍼의 데이터가 ARGB_8888 형식이 아니라면 (OP는 그렇지 않다고 말함) 전혀 작동하지 않습니다. –

+0

카메라의 [데이터 시트] (http://www.mouser.com/ds/2/451/uCAM-DS-rev7-3555.pdf)의 8 페이지에 따르면 16 비트 컬러 이미지가 원시 565 (RGB) 이미지이므로 안드로이드의 RGB_565가 이론적으로 작동해야합니다. –

0

나는 비슷한 문제이고, 이것은 내가 그것을 해결하는 방법입니다

(1) 이전에 먼저 역의 ByteBuffer

로 포장 할 필요가 있는지, 당신이받은 바이트 배열을 확인

(2) 리틀 엔디안으로 변경해야하는 경우 참조의 ByteBuffer의 엔디 언을 확인 내 경우

(기본 바이트 순서는 빅 엔디안), 나는 ByteBuffer를 변경, 첫번째 바이트 배열을 반대해야 리틀 엔디안에 이르기까지 올바른 이미지를 얻을 수 있습니다.

의사 코드 :

byte[] imageData ; (byte array received) 
reverseByteArray(imageData); 

Bitmap bitmap = Bitmap.createBitmap(imgWidth, imgHeight,Bitmap.Config.RGB_565); 

ByteBuffer buffer = ByteBuffer.wrap(imageData); 
ByteBuffer newBuffer = ByteBuffer.allocate(buffer.capacity()); 
newBuffer.order(ByteOrder.LITTLE_ENDIAN); 
for (int i = 0; i < buffer.capacity(); i++) { 
      byte b = buffer.get(i); 
      newBuffer.put(b); 
     } 
newBuffer.flip(); 
bitmap.copyPixelsFromBuffer(newBuffer); 
setImage(bitmap); 

//------ 
public static void reverseByteArray(byte[] array) { 
     if (array == null) { 
      return; 
     } 
     int i = 0; 
     int j = array.length - 1; 
     byte tmp; 
     while (j > i) { 
      tmp = array[j]; 
      array[j] = array[i]; 
      array[i] = tmp; 
      j--; 
      i++; 
     } 
    } 
관련 문제