본문 바로가기
공부기록/안드로이드

[안드로이드/자바] Uri에서 Bitmap 얻기 (Software rendering doesn't support hardware bitmaps)

by 책읽는 개발자 ami 2022. 8. 24.
728x90
반응형

Uri에서 Bitmap을 얻는 함수는 아래와 같이 만들 수 있다.

이때 주의해야 할 점은 SDK버전에 따라 다른 함수를 사용한다는 점과 이 함수를 통해 얻어온 bitmap이 변경가능해야 할 때 몇 가지 설정이 더 필요하다는 것이다.

public static Bitmap getBitmapFromImageUri(Context context, Uri uri) {
    Bitmap bitmap = null;
    try {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.getContentResolver(), uri), new ImageDecoder.OnHeaderDecodedListener() {
                @Override
                public void onHeaderDecoded(@NonNull ImageDecoder imageDecoder, @NonNull ImageDecoder.ImageInfo imageInfo, @NonNull ImageDecoder.Source source) {
                    imageDecoder.setMutableRequired(true);
                    imageDecoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE);
                }
            });
        }
        else {
            bitmap = MediaStore.Images.Media.getBitmap(inContext.getContentResolver(), uri);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bitmap;
}

 

해당 함수를 통해 얻어온 bitmap이 변경 가능하게 하기 위해선 decodeBitmap() 함수의 두 번째 인자에 리스너 new ImageDecoder.OnHeaderDecodedListener() 를 오버라이드 시켜주고 아래처럼 두 가지 설정을 해주어야 한다.

아래 설정을 해주지 않고 bitmap을 변경시키면 Software rendering doesn't support hardware bitmaps 에러가 발생한다.

imageDecoder.setMutableRequired(true);
imageDecoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE);

 


 

ImageDecoder.ALLOCATOR_SOFTWARE
Use a software allocation for the pixel memory.
Useful for drawing to a software Canvas or for accessing the pixels on the final output.

 

728x90
반응형