2017-01-15 3 views
1

이미지 크기를 조정하지 않고 카메라로 찍은 사진을 압축하려고합니다.Bitmap.compress - 작동하지 않습니다.

bitmap.compress를 사용해 보았지만 제대로 작동하지 않았습니다. 그냥 리소스에서로드 된 있지만 여전히 성공 비트 맵 압축 시도했는지 확인하려면.

어떤 아이디어가 있습니까?

예제 코드 :

//load bitmap from resources: 
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.trolltunga); 
Log.d("roee", "onImageCaptured: before compress = " + bitmap.getByteCount() + ", " + bitmap.getWidth() + ", " + bitmap.getHeight()); 

//compressing 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos); 
Bitmap comp = BitmapFactory.decodeStream(new ByteArrayInputStream(bos.toByteArray())); 
Log.d("roee", "onImageCaptured: after compress = " + comp.getByteCount() + ", " + comp.getWidth() + ", " + comp.getHeight()); 

로그 결과 :

D/roee: onImageCaptured: before compress = 10800000, 3000, 900 
D/roee: onImageCaptured: after compress = 10800000, 3000, 900 
+1

'비트 맵'은 절대 압축되지 않습니다. 코드가 예상대로 작동합니다. 비트 맵 * 파일 *은'PNG' 나'JPEG'와 같은 압축 파일 형식을 사용하여'compress() '할 때 압축됩니다. 기술적으로'ByteArrayOutputStream'은 압축되어 있습니다. – CommonsWare

답변

3

짧은 버전 : 당신은 비트 맵을 압축하고 즉시 나중에

긴 버전의 압축을 해제 :

,536을

Bitmap은 압축되지 않습니다. 더 빠른 드로잉과 처리를 위해 전체 크기로 이미지를 나타내는 바이트 배열을위한 컨테이너 클래스입니다.

사진을 다른 형식으로로드하는 데 종종 사용됩니다. JPEG을 표시하거나 편집하기 위해 메모리에 JPEG를 삽입하고 다른 파일 형식으로 직접로드하거나 저장하는 여러 가지 방법이 있습니다.

압축 된 파일 형식 (귀하의 경우 JPEG)으로 압축되지 않은 바이트 배열을 변환 한 다음 스트림으로 출력하여 저장 장치 나 다른 것으로 저장할 수 있습니다. 그 중 하나는 compress입니다.

BitmapFactory.decodeStream을 사용하면 스트림의 정보를 읽고 파일 형식을 인식하며 은 비 압축 바이트 배열로을 디코딩합니다. 일반적으로 이미지 저장 공간을로드하는 데이 파일을 사용합니다.

여기서 한 것은 Bitmap이며 JPEG로 압축 한 다음 (일부 정보 손실) 압축 해제 된 비트 맵으로 다시 압축합니다. 해상도가 동일하므로 메모리에있는 바이트 수와 크기가 같습니다. .

솔루션 : 당신이 압축이 일 경우, 참조 단지 당신은 비트 맵을 압축 할 수 bos.toByteArray().length

0

과 출력 스트림의 크기를 측정하십시오. ByteArrayOutputStream만이 JPEG와 같은 특정 형식으로 압축되어 있으므로 ByteArrayOutputStream의 압축 길이를 확인할 수 있습니다.