안드로이드 개발 질문/답변
(글 수 45,052)
카메라에서 영상을 받아와 화면에 표시하고, 영상에대해 영상처리(마커인식)을 하기 위해 작업하고있습니다.
카메라열기->화면표시->PreviewCallBack함수에서 byte[] data를 가져와서 작업하려고 하는데,
byte[] -> bitmap 변환시, Logcat메시지 ->"SkImageDecoder::Factory returned null"가 발생합니다.
camera = Camera.open(); try{ camera.setPreviewDisplay(sHolder); camera.setPreviewCallback(cameraPreivewCB); // 콜백함수 등록 } catch (IOException e) { camera.release(); camera = null; }
public class CameraPreviewCallBack implements PreviewCallback { public void onPreviewFrame(byte[] data, Camera camera){ try{ bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // <-여기에서 메시지 발생 if (bitmap == null) { Log.d("CameraPreviewCallback", "bitmap is null"); return; } bitmap = Bitmap.createBitmap(bitmap, 0, 0, CameraImage.WIDTH, CameraImage.HEIGHT); } catch(Exception e){ Log.d("", "Bitmap error:"+e); } } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
무엇이 문제인지?
해결할려면 어떻게 접근해야하는지?
고수님들의 답변 부탁드립니다.
-구글링 해보니, "순수한Raw Data일 경우 bitmap헤더를 만들어 넣으면 해결된다"?라고 하는데 어떻게 하는지 모르겠네요;
-이전에 socket으로 부터 받은 byte[]를 똑깥은 방법으로 했을경우 됬는데,,,, 카메라에서 받아오니깐 안되는 이유가 무엇인지'''
2010.05.22 21:26:35
YUV 포맷을 TV에 전송하는 칼라포멧입니다.
Y는 흑백 그레이 영상 이구요.
UV 가 칼라정보를 가지고 있답니다.
Y값만 출력하면 흑백TV 처럼 나오답니다.
흑백TV와 칼라TV를 한 신호로 보내고, 흑백TV에서는 Y값만 사용하면 되기 때문에 이런 포멧이나왔다고 보셔도 됩니다.
Y는 흑백 그레이 영상 이구요.
UV 가 칼라정보를 가지고 있답니다.
Y값만 출력하면 흑백TV 처럼 나오답니다.
흑백TV와 칼라TV를 한 신호로 보내고, 흑백TV에서는 Y값만 사용하면 되기 때문에 이런 포멧이나왔다고 보셔도 됩니다.
2010.06.01 02:35:43
저도 똑같은 일로 고생하고있는데요... 뉴_ㅠ
전 안드로이드 A에서 코딩하고 있는습니다. 기기마다 다른건지 아니면 bitmap을 생성할때 무언가 잘못한건지 모르겠네요
decodeYUV420SP함수는 CameraPreviewCallBack 에 public으로 놓고 사용했거든요? 뉴_ㅠ 그렇게 해서 변환된 rgb를 사용해서
bitmap = Bitmap.createBitmap(pixels, size.width, size.height, Bitmap.Config.ARGB_8888); 이렇게 생성해줬는데
디버깅하면서 보니 bitmap의 mHeight와 mWidth가 -1로 되더라구요....
초보인데 이런걸 해보려니 너무 어렵네요....혹시 decodeYUV420SP를 thread로 만들어야 하나요? 뉴_ㅠ
문제해결했습니다.
원인은 카메라에서 넘어오는 Data가 YUV포맷이기 때문이고,
해결책은 YUV->RGB포맷으로 변경후 Bitmap을 생성하니깐 되네요
(참고사이트: http://code.google.com/p/android/issues/detail?id=823 )
YUV포맷에서 곧바로 Bitmap을 못만드는 이유는??모르겠네요;;; YUV포맷은 어떤놈일까요?ㅋ