URI에서 비트맵을 가져오는 방법?
URI에서 비트맵 개체를 가져오는 방법(저장에 성공한 경우)/data/data/MYFOLDER/myimage.png
아니면file///data/data/MYFOLDER/myimage.png
애플리케이션에 사용할 수 있습니까?
이것을 어떻게 할 것인지 아는 사람이 있습니까?
올바른 방법은 다음과 같습니다.
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
Uri imageUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
}
}
매우 큰 이미지를 로드해야 하는 경우 다음 코드가 타일로 로드됩니다(대량 메모리 할당을 피함).
BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false);
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);
여기서 답 보기
올바른 방법은 다음과 같습니다. 메모리 사용량도 계속해서 확인할 수 있습니다.
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
Uri imageUri = data.getData();
Bitmap bitmap = getThumbnail(imageUri);
}
}
public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{
InputStream input = this.getContentResolver().openInputStream(uri);
BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
onlyBoundsOptions.inJustDecodeBounds = true;
onlyBoundsOptions.inDither=true;//optional
onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
input.close();
if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) {
return null;
}
int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;
double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
bitmapOptions.inDither = true; //optional
bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//
input = this.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
input.close();
return bitmap;
}
private static int getPowerOfTwoForSampleRatio(double ratio){
int k = Integer.highestOneBit((int)Math.floor(ratio));
if(k==0) return 1;
else return k;
}
Mark Ingram의 게시물에서 getBitmap() 호출도 디코드 Stream()을 호출하므로 어떤 기능도 잃지 않습니다.
참조:
는 것 같습니다.MediaStore.Images.Media.getBitmap
에서 감가상각되었습니다.API 29
. 권장 방법은 다음을 사용하는 것입니다.ImageDecoder.createSource
에 추가된API 28
.
비트맵을 가져오는 방법은 다음과 같습니다.
val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
ImageDecoder.decodeBitmap(ImageDecoder.createSource(requireContext().contentResolver, imageUri))
} else {
MediaStore.Images.Media.getBitmap(requireContext().contentResolver, imageUri)
}
중요:ImageDecoder.decodeBitmap
EX를 읽다IF 방향,Media.getBitmap
Doesn't.
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e)
{
//handle exception
}
예 경로는 이와 같은 형식이어야 합니다.
file:///mnt/sdcard/filename.jpg
private void uriToBitmap(Uri selectedFileUri) {
try {
ParcelFileDescriptor parcelFileDescriptor =
getContentResolver().openFileDescriptor(selectedFileUri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
가장 쉬운 해결책은 다음과 같습니다.
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
이렇게 uri에서 비트맵을 검색할 수 있습니다.
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
e.printStackTrace();
}
Uri imgUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imgUri);
private fun setImage(view: ImageView, uri: Uri) {
val stream = contentResolver.openInputStream(uri)
val bitmap = BitmapFactory.decodeStream(stream)
view.setImageBitmap(bitmap)
}
Bitmap bitmap = null;
ContentResolver contentResolver = getContentResolver();
try {
if(Build.VERSION.SDK_INT < 28) {
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri);
} else {
ImageDecoder.Source source = ImageDecoder.createSource(contentResolver, imageUri);
bitmap = ImageDecoder.decodeBitmap(source);
}
} catch (Exception e) {
e.printStackTrace();
}
글라이드 라이브러리를 사용하면 비트맵을 얻을 수 있습니다.uri
,
거의 samsung 디바이스에서 회전된 이미지는 우리가 회전을 확인해야할 때 그리고 우리는 회전을 확인해야합니다.exifinterface
그러나 글라이드를 사용하면 회전 여부를 확인할 필요가 없으며 이미지가 항상 올바르게 수신됩니다.
코틀린에서 얻을 수 있는bitmap
~하듯이
CoroutineScope(Dispatchers.IO).launch {
var bitmap = Glide.with(context).asBitmap().load(imageUri).submit().get()//this is synchronous approach
}
저는 이 종속성을 사용하고 있습니다.
api 'com.github.bumptech.glide:glide:4.12.0'
kapt 'com.github.bumptech.glide:compiler:4.12.0'
인셋getBitmap
지금 나는 코틀린에서 다음과 같은 접근법을 사용합니다.
PICK_IMAGE_REQUEST ->
data?.data?.let {
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(it))
imageView.setImageBitmap(bitmap)
}
InputStream imageStream = null;
try {
imageStream = getContext().getContentResolver().openInputStream(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
ContentResolver cr = context.getContentResolver();
try (InputStream input = cr.openInputStream(url)) {
Bitmap bitmap = BitmapFactory.decodeStream(input);
}
아래와 같이 startActivityForResult 메서드를 사용합니다.
startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"), PICK_IMAGE);
다음과 같은 결과를 얻을 수 있습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case PICK_IMAGE:
Uri imageUri = data.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
저는 많은 방법을 시도해 봤습니다.이 일은 나에게 딱 들어맞습니다.
갤러리에서 그림을 고르시면.당신은 주의할 필요가 있습니다.Uri
부터intent.clipdata
아니면intent.data
, 그 중 하나가 다른 버전에서 null일 수 있기 때문입니다.
private fun onChoosePicture(data: Intent?):Bitmap {
data?.let {
var fileUri:Uri? = null
data.clipData?.let {clip->
if(clip.itemCount>0){
fileUri = clip.getItemAt(0).uri
}
}
it.data?.let {uri->
fileUri = uri
}
return MediaStore.Images.Media.getBitmap(this.contentResolver, fileUri )
}
정답이 안보여서 여기에 내선번호를 달겠습니다.
fun Context.getBitmap(uri: Uri): Bitmap =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) ImageDecoder.decodeBitmap(ImageDecoder.createSource(this.contentResolver, uri))
else MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
코드의 예:
val bitmap = context.getBitmap(uri)
팁: 활동/파편을 위해 확장자를 업데이트할 수도 있으므로 컨텍스트를 전혀 작성할 필요가 없습니다.신스슈가 조금 더)
val bitmap = context.contentResolver.openInputStream(uri).use { data ->
BitmapFactory.decodeStream(data)
}
다음을 사용하여 입력 스트림을 열어야 합니다.
사용하다
작업이 완료되면 스트림이 자동으로 닫힙니다.
다음 구조를 수행할 수 있습니다.
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case 0:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
Bundle extras = imageReturnedIntent.getExtras();
bitmap = extras.getParcelable("data");
}
break;
}
이를 통해 uri를 비트맵으로 쉽게 변환할 수 있습니다.도와주길 바랍니다.
(KOTLIN) 2020년 4월 7일 현재 위에 언급된 옵션 중 아무 것도 작동하지 않았지만, 저에게 작동한 것은 다음과 같습니다.
val에 비트맵을 저장하고 이를 사용하여 imageView(영상 보기)를 설정하려면 다음을 사용합니다.
val bitmap = BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }
비트맵을 및 imageView로 설정하려면 다음을 사용합니다.
BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }
* For getting bitmap from uri. Work for me perfectly.
public static Bitmap decodeUriToBitmap(Context mContext, Uri sendUri) {
Bitmap getBitmap = null;
try {
InputStream image_stream;
try {
image_stream = mContext.getContentResolver().openInputStream(sendUri);
getBitmap = BitmapFactory.decodeStream(image_stream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return getBitmap;
}
모바일 갤러리에서 image uri를 가져오는 전체 메서드입니다.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri filePath = data.getData();
try { //Getting the Bitmap from Gallery
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
rbitmap = getResizedBitmap(bitmap, 250);//Setting the Bitmap to ImageView
serImage = getStringImage(rbitmap);
imageViewUserImage.setImageBitmap(rbitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
여기에 제공된 솔루션을 사용하여 반복적으로 발생하는 문제는 다음과 같습니다.
com.samsung.systemui.navillera.navillera 공급자에 대한 공급자 정보를 찾지 못했습니다.
이렇게 하면 비트맵이 로드되지 않습니다.
제가 대신 먹어봤는데 효과가 있어요!하나님을 찬양합니다.
제공된 uri를 파일 경로로 변환해야 한다는 설명입니다.
Bitmap b1 = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.fromFile(new File(uri1.toString())));
이를 위해 2022년에는 코일 리브레이를 사용합니다.
https://coil-kt.github.io/coil/compose/
제트팩 컴포지트용
AsyncImage(
model = uriOfImage,
contentDescription = null,
)
언급URL : https://stackoverflow.com/questions/3879992/how-to-get-bitmap-from-an-uri
'programing' 카테고리의 다른 글
각도 사용범위 변수를 변경하지 않고 입력 필드의 형식을 지정하는 JS 지시문 (0) | 2023.10.21 |
---|---|
PHP에서 SSH를 통해 MySQL 서버에 연결 (0) | 2023.10.21 |
ASP .NET MVC 필드별 수준에서 클라이언트 측 유효성 검사 사용 안 함 (0) | 2023.10.16 |
JDBC Connection Pooling을 사용하고 있습니까? (0) | 2023.10.16 |
엔티티 프레임워크 포함() 강력하게 입력됨 (0) | 2023.10.16 |