2012-08-08 3 views
3

"grayscaled bitmap"(1 바이트 -> 1 픽셀)에 해당하는 바이트 배열이 있으며이 이미지의 PNG 파일을 만들어야합니다.android의 그레이 스케일 비트 맵

아래의 방법이 작동하지만, 사용중인 비트 맵이 1 바이트 대신 픽셀 당 4 바이트를 차지하므로 비트 맵이 거대합니다.

ARGB_8888 이외의 다른 Bitmap.Config와 함께 작동시키지 못했습니다. 어쩌면 ALPHA_8이 내가 필요로하는 것이지만, 제대로 작동하지 못했습니다.

나는 또한 다른 게시물 (Convert a Bitmap to GrayScale in Android)에 포함되어있는 toGrayScale 메서드를 시도했지만 크기와 동일한 문제가 있습니다.

public static boolean createPNGFromGrayScaledBytes(ByteBuffer grayBytes, int width, 
     int height,File pngFile) throws IOException{ 

    if (grayBytes.remaining()!=width*height){ 
     Logger.error(Tag, "Unexpected error: size mismatch [remaining:"+grayBytes.remaining()+"][width:"+width+"][height:"+height+"]", null); 
     return false; 
    } 
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    // for each byte, I set it in three color channels. 
    int gray,color; 
    int x=0,y=0;   
    while(grayBytes.remaining()>0){ 

     gray = grayBytes.get(); 
     // integer may be negative as byte is signed. make them positive. 
     if (gray<0){gray+=256;} 

     // for each byte, I set it in three color channels. 
     color= Color.argb(-1, gray, gray, gray); 


     bitmap.setPixel(x, y, color); 
     x++; 
     if (x==width){ 
      x=0; 
      y++; 
     }   
    } 
    FileOutputStream fos=null; 

    fos = new FileOutputStream(pngFile); 
    boolean result= bitmap.compress(Bitmap.CompressFormat.PNG,100,fos); 
    fos.close(); 
    return result; 
}  

편집 : 생성 된 파일에 링크 (말도 안되는 것처럼 보이지만 방금 랜덤 데이터로 생성 됨). http://www.tempfiles.net/download/201208/256402/huge_png.html

도움을 주시면 대단히 감사하겠습니다.

+0

"거대한"을 정의하십시오. 저의 이미지 편집 프로그램은 회색조 PNG보다 40 % 정도 큰 투명도의 RGB PNG를 만듭니다. 300 % 더 많은 데이터를 고려하면 나쁘지 않습니다. –

+0

원본 회색 음영 png는 1732K입니다. 위의 절차로 만든 png는 5445K – richardtz

+0

와우입니다. PNG 압축기의 버그와 비슷합니다. 5445K 결과를 가져 와서 많은 PNG 압축기 중 하나를 통해 실행하면 결과가 얼마나 큽니까? 그 파일을 어딘가에 게시 할 수 있습니까? –

답변

4

회색조 이미지를 RGB로 저장하는 것은 비용이 많이 듭니다. 광도 데이터가있는 경우 RGB PNG가 아닌 그레이 스케일 PNG로 저장하는 것이 좋습니다.

Android 프레임 워크에서 사용할 수있는 비트 맵 및 이미지 기능은 실제로 프레임 워크 및 UI 구성 요소가 지원하는 이미지 형식을 읽고 쓰는 데 중점을 둡니다. 그레이 스케일 PNG는 여기에 포함되지 않습니다.

당신은 안드로이드에 그레이 스케일 PNG를 저장하려는 경우, 당신은에 이진 데이터를 저장하기 위해 라이브러리를 사용할 수 있습니다, 당신은 안드로이드 라이브러리 OpenCV의를 사용하는 경우 http://code.google.com/p/pngj/

+0

나는 당신이 제안한 도서관과 함께 노력할 것입니다. 이상한 점은 Android Framework를 사용하여 수행 할 수 없다는 것입니다. 감사! – richardtz

+0

평범한 구식 Java에서 할 수 있지만 Android에 필수 클래스가 없습니다. 휘도 이미지를 저장하는 것은 핸드셋에서 아주 드문 일입니다. –

+0

크기 때문에 이미지가 이메일로 전송되기 때문에 걱정됩니다. 그러나 나는 그것이 핸드셋의 일반적인 사용 사례가 아니라는 데 동의한다. – richardtz

2

같은 라이브러리를 사용해야합니다 png 파일. 다음

jbyte* _ByteArray_BrightnessImgForOCR = env->GetByteArrayElements(ByteArray_BrightnessImgForOCR, 0); 
Mat img(ByteArray_BrightnessImgForOCR_h, ByteArray_BrightnessImgForOCR_w, CV_8UC1, (unsigned char *) _ByteArray_BrightnessImgForOCR); 

그리고 PNG 파일에 기록 : 누구의 데이터를 바이트 배열로 시작 세트 매트, JNI 부분에 : 내 방법입니다.

imwrite("/mnt/sdcard/binaryImg_forOCR.png", img); 

물론 OpenCV 및 Java 원시 코딩에 익숙해 지려면 시간이 필요합니다. OpenCV for Android examples 다음으로 배우는 것이 빠릅니다.

관련 문제