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
반응형
'공부기록 > 안드로이드' 카테고리의 다른 글
Android TextView setColor() (자바에서 코딩으로) (0) | 2022.08.05 |
---|---|
WebView에서 내부저장소 이미지 load하기 (0) | 2022.08.01 |
Android Emulator can't provide internet (0) | 2022.06.22 |
[안드로이드] 키보드 show&hide 이벤트 발생시키기 (0) | 2021.04.12 |
[안드로이드] 웹뷰에서 파일 업로드할 때 에러, FileProvider에 대해 알아보기 (0) | 2021.03.16 |