2011-04-11 5 views
6

네트워크에서 원시 이미지를 읽는 중입니다. 이 이미지는 파일이 아닌 이미지 센서에서 읽었습니다. 원시 이미지에서 비트 맵을 얻는 방법

내가 이미지에 대해 알고있는 것들 :
~ 높이 & 폭
~ (바이트) 전체 크기 난


~ 8 비트 그레이 스케일
~ 1 바이트/픽셀 이 이미지를 비트 맵으로 변환하여 이미지 뷰에 표시하려고합니다.

는 여기에 내가 뭘하려 : 그것은 내 이미지를 디코딩 할 수 없기 때문에

BitmapFactory.Options opt = new BitmapFactory.Options(); 
opt.outHeight = shortHeight; //360 
opt.outWidth = shortWidth;//248 
imageBitmap = BitmapFactory.decodeByteArray(imageArray, 0, imageSize, opt); 

decodeByteArray는 를 반환합니다.

는 또한 첫번째 바이트 배열로 변환하지 않고, 상기 입력 스트림으로부터 직접 판독 시도 :

imageBitmap = BitmapFactory.decodeStream(imageInputStream, null, opt); 

이 아니라 를 반환한다.

나는이 & 다른 포럼을 검색했지만이를 수행 할 수있는 방법을 찾을 수 없습니다.

아이디어가 있으십니까?

편집 : 내가 수행 한 첫 번째 작업은 스트림에 실제로 원본 이미지가 포함되어 있는지 확인하는 것입니다. 나는 다른 응용 프로그램 (iPhone/Windows MFC) &을 사용하여이 응용 프로그램을 읽고 이미지를 올바르게 표시 할 수 있습니다. Java/Android에서이 작업을 수행하는 방법을 찾아야합니다.

답변

11

Android는 회색 음영 비트 맵을 지원하지 않습니다. 먼저 모든 바이트를 32 비트 ARGB int로 확장해야합니다. 알파는 0xff이며, R, G 및 B는 원본 이미지의 바이트 픽셀 값의 복사본입니다. 그런 다음 해당 배열 위에 비트 맵을 만듭니다.

또한 (의견을 참조하십시오.) 장치는 0은 흰색, 1은 검정이라고 생각합니다. 소스 비트를 반전시켜야합니다.

그래서 소스 이미지가 Src라는 바이트 배열에 있다고 가정 해 보겠습니다. 코드는 다음과 같습니다.

byte [] src; //Comes from somewhere... 
byte [] bits = new byte[src.length*4]; //That's where the RGBA array goes. 
int i; 
for(i=0;i<src.length;i++) 
{ 
    bits[i*4] = 
     bits[i*4+1] = 
     bits[i*4+2] = ~src[i]; //Invert the source bits 
    bits[i*4+3] = 0xff; // the alpha. 
} 

//Now put these nice RGBA pixels into a Bitmap object 

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
bm.copyPixelsFromBuffer(ByteBuffer.wrap(bits)); 
+0

@ Seva Alekseyev : 대답 주셔서 감사합니다. 나는 당신의 제안을 시도했다. 런타임 예외를 받고있다. logcat "버퍼에 대한 픽셀만큼 큰". 나는 너비를 사용하여 비트 맵을 만들고 있어요. 이미지의 높이 & 높이 – OceanBlue

+0

@OceanBlue : 비트 버퍼가 4 * 너비 * 높이 바이트보다 작음을 나타내는 메시지입니다. 있는지 확인하십시오 .ARGB_888은 픽셀 당 4 바이트입니다. –

+0

@Seva Alekseyev : 알아요. 비트 버퍼가 너비 * 높이 바이트 길이인지 확인하십시오. 이미지는 픽셀 형식 당 1 바이트입니다. 따라서 크기가 4 배인 바이트 배열을 만들더라도 이미지는 첫 번째 1/4 부분에 저장됩니다. 안드로이드에서 "픽셀 당 1 바이트"형식을 알고 있습니까? – OceanBlue

1

내가 카메라 미리보기 콜백에서 얻은 바이트 스트림을 디코딩하기 위해이 같은 짓을하면 :

Bitmap.createBitmap(imageBytes, previewWidth, previewHeight, 
         Bitmap.Config.ARGB_8888); 

그것을 시도 줄.

+1

답변 해 주셔서 감사합니다. 첫 번째 매개 변수 인 "imageBytes"에는 무엇이 포함되어 있습니까? 온라인 Javadoc에서 볼 수있는 오버로드 된 Bitmap.createBitmap (...) 버전 중 아무 것도 바이트 배열을 매개 변수로 사용합니다. – OceanBlue

+1

그런 방법은 없습니다. – Peter

0

스트림에서 Drawable create를 사용하십시오. 다음은 HttpResponse로이를 수행하는 방법입니다.하지만 어쨌든 원하는 입력 스트림을 얻을 수 있습니다.

InputStream stream = response.getEntity().getContent(); 

    Drawable drawable = Drawable.createFromStream(stream, "Get Full Image Task"); 
+0

답변 해 주셔서 감사합니다. 불행하게도 이것은 null도 반환합니다 :-(Drawable.createFromStream이 null http://developer.android를 반환하는 이유에 대한 온라인 JavaDocs를 확인했습니다.com/reference/android/graphics/drawable/Drawable.html # createFromStream % 28java.io.InputStream, % 20java.lang.String % 29하지만 자세한 것은 아닙니다. 다른 비 Android 응용 프로그램이 스트림을 읽고 이미지를 표시 할 수 있으므로 스트림 자체가 유효하다는 것을 알았 음을 추가해야합니다. (나는 그 응용 프로그램에 대한 소스가 없습니다). – OceanBlue

+0

서비스가 이미지를 올바르게 반환하지 않는 것 같습니다. –

+0

확실하게, 이것은 가장 가능성이 높습니다. 그러나 테스트를 거쳤습니다. & 서비스가 올바르게 이미지를 반환합니다. (내 EDIT를 참조하십시오). 그래서 지금 flummoxed 오전 :-) ( – OceanBlue

관련 문제