2011-11-18 1 views
2

안녕하세요 저는 카메라에서 이미지를 가져 오는 안드로이드 응용 프로그램을 작성하고 있었는데 카메라 매개 변수 메서드 setPictureFormat()이 실제로하는 일과 그 영향에 대해 궁금합니다. 내가 아는 한 camera.takePicture()는 실제로 JPEG 콜백의 데이터 만 제공합니다. 그래서 onPictureTaken()에 도착한 데이터 배열은 JPEG 데이터라고 생각합니까? 그렇다면 왜이 매개 변수를 PixelFormat.RGB_565로 설정해야합니까? 그리고 직접적으로 데이터 배열을 직접 해석 할 수있는 방법이 있는가 onPictureTaken() BitmapFactory.decodeByteArray 예를 들어? 다소 이상한 점은 2448 * 3264 해상도의 결과 이미지가 총 7990272 픽셀에 해당한다는 것입니다. 그러나이 이미지를 생성 한 기본 데이터 배열은 약 2000000 픽셀의 길이를 가지고 있습니다. 누군가가 저를 위해 그것을 명백하게 할 수 있던 경우에 매우 평가 될 것입니다.안드로이드 카메라 setPictureFormat 및 onPictureTaken의 데이터 배열

답변

10

setPictureFormat() 메서드는 takePicture()에 전달하는 raw 및 postView 콜백에서 반환 된 바이트 배열에 픽셀 형식을 적용합니다. 문서에서 언급했듯이 이러한 콜백은 지원할 버퍼가없는 하드웨어에서도 발생하지 않을 수 있지만 이러한 상황이 발생하면 데이터는이 설정에 따라 형식이 지정됩니다. JPEG 콜백이 JPEG 형식으로 압축 된 데이터를 다시 전달하는 것이 맞습니다.

예를 들어, 원시 바이트 배열의 크기는 선택한 픽셀 형식에 따라 달라집니다. 2448 * 3264 = 7,990,272 픽셀이지만 각 픽셀은 배열의 바이트 수로 표시됩니다. 예를 들어, NV16 또는 RGB_565와 같은 형식은 각 픽셀을 나타 내기 위해 16 비트 (2 바이트)를 갖습니다. 즉, 실제 원시 바이트 배열 길이는 15,980,554 (~ 15MB)이며 이는 메모리에 한 번에 저장할 수있는 매우 많은 양의 데이터입니다 (원래 G1의 거의 전체 힙 크기). 따라서 모든 장치가 원시 이미지 데이터를 버퍼링하고 반환하지는 않습니다.

JPEG 콜백에서 반환 된 데이터의 길이를 검사 할 때 더 이상 원시 비트 맵 이미지가 아닌 압축 된 JPEG 이미지 데이터를보고있는 것입니다. 이런 이유로 결과는 훨씬 작아 질 것입니다. 이 JPEG 이미지 데이터를 비트 맵으로 다시 팽창 시키면 (예 : BitmapFactory 사용) 크기가 다시 조정됩니다. ARGB_8888 비트 맵 (픽셀 당 4 바이트)으로 메모리에로드 된 이미지는 약 32MB를 소비합니다. 코드에서 OutOfMemoryException을 향한 쉬운 길입니다.

희망이 도움이됩니다!

+0

감사합니다. 감사합니다. 감사합니다. – Christian