android - BitmapFactory.decodeStream()方法分配内存变大的问题
迷茫
迷茫 2017-04-17 17:47:36
0
3
673

下载同一张图片,在windows中可以看到图片文件的大小是102K的,而inputStream通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存。而我直接用FileOutputStream把inputStream写入文件,文件大小是102k和windows里的一样,请问这种情况怎么造成的?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(3)
巴扎黑

먼저 두 가지 개념을 명확히 해야 합니다.
1. 비트맵: 여기서 제가 이해하는 것은 Android 시스템의 비트맵 이미지 형식으로, 일반적으로 메모리에만 존재하며 시스템에서 표시하는 데 사용됩니다.
2. 파일: 하드디스크나 플래시에 존재하는 파일로, 일반적으로 jpeg나 png 등 일종의 압축 방식을 사용합니다.
여기서는 비교 및 ​​설명을 위해 jpeg와 비트맵을 예로 사용합니다.
jpeg는 압축되어 저장에 적합하지만 직접 표시할 수 없으며 표시하기 전에 디코딩해야 합니다.
비트맵은 압축되지 않은 이미지이며 저장 공간을 너무 많이 차지하므로 저장에 적합하지 않습니다.

보이는 현상을 설명하자면
Windows에서는 이미지 파일의 크기가 102K인 것을 알 수 있습니다. : BitmapFactory를 통해
압축된 파일입니다. decodeStream () 메소드는 비트맵으로 변환하지만 750k의 메모리 할당이 필요합니다. 이때 압축된 파일은 메모리에 비트맵 파일로 압축 해제됩니다. 압축 해제 후 표시하기에 적합한 형식입니다. 구체적으로, okadanana의 대답은
FileOutputStream을 직접 사용하여 inputStream을 파일에 쓰는데, 파일 크기는 102k입니다입니다. 파일을 디코딩하지 않고 메모리에 넣으면 파일이 그대로 기록되며 물론 크기는 변경되지 않습니다.

Ty80

이미지는 픽셀로 구성되므로 이미지 크기를 계산하려면 3가지 매개변수를 알아야 합니다.

  • 사진 길이

  • 사진폭

  • 각 픽셀이 차지하는 메모리 크기
    따라서 공식

  • 이 얻어집니다.

이미지가 차지하는 메모리 크기 = 이미지 길이 x 이미지 너비 x 각 픽셀이 차지하는 메모리 크기

안드로이드에서 각 픽셀이 차지하는 메모리 크기는 4가지 구성이 있는 Bitmap.Config에 의해 결정됩니다

配置 占用的字节数
Bitmap.Config.ALPHA_8 一个像素1个字节
Bitmap.Config.ARGB_4444 一个像素2个字节
Bitmap.Config.RGB_565 一个像素2个字节
Bitmap.Config.ARGB_8888 一个像素4个字节

그래서 BitmapFactory.decodeStream()이 생성하는 비트맵의 크기에 영향을 미치는 것은 Bitmap.Config입니다. 따라서 판독되는 크기는 자연스럽게 다릅니다.

伊谢尔伦

다운로드하는 이미지는 jpg 또는 png여야 합니다. 두 형식 모두 일정한 압축률을 가지고 있으며, 압축하지 않으면 메모리에 RGB 형태로 존재하게 됩니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿