उरी से एक बिटमैप ऑब्जेक्ट कैसे प्राप्त करें (यदि मैं इसे अपने आवेदन में उपयोग करने के लिए /data/data/MYFOLDER/myimage.png
या इसमें स्टोर करने में सफल रहा
file///data/data/MYFOLDER/myimage.png
)?
किसी को भी यह कैसे पूरा करने पर एक विचार है?
उरी से एक बिटमैप ऑब्जेक्ट कैसे प्राप्त करें (यदि मैं इसे अपने आवेदन में उपयोग करने के लिए /data/data/MYFOLDER/myimage.png
या इसमें स्टोर करने में सफल रहा
file///data/data/MYFOLDER/myimage.png
)?
किसी को भी यह कैसे पूरा करने पर एक विचार है?
जवाबों:
। । महत्वपूर्ण: बेहतर समाधान के लिए @Mark Ingram के नीचे और @pjv से उत्तर देखें। । ।
आप यह कोशिश कर सकते हैं:
public Bitmap loadBitmap(String url)
{
Bitmap bm = null;
InputStream is = null;
BufferedInputStream bis = null;
try
{
URLConnection conn = new URL(url).openConnection();
conn.connect();
is = conn.getInputStream();
bis = new BufferedInputStream(is, 8192);
bm = BitmapFactory.decodeStream(bis);
}
catch (Exception e)
{
e.printStackTrace();
}
finally {
if (bis != null)
{
try
{
bis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (is != null)
{
try
{
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return bm;
}
लेकिन याद रखें, इस विधि को केवल एक थ्रेड (GUI -थ्रेड नहीं) के भीतर से बुलाया जाना चाहिए। मैं एक AsyncTask।
यहाँ यह करने का सही तरीका है:
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;
}
मार्क इनग्राम के पोस्ट से गेटबिटमैप () कॉल भी डिकोडस्ट्रीम () को कॉल करता है, इसलिए आप कोई कार्यक्षमता नहीं खोते हैं।
संदर्भ:
getPowerOfTwoForSampleRatio()
को छोड़ दिया जा सकता है। देखें: developer.android.com/reference/android/graphics/…
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e)
{
//handle exception
}
और हाँ पथ इस तरह के एक प्रारूप में होना चाहिए
file:///mnt/sdcard/filename.jpg
यह सबसे आसान उपाय है:
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
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(context.getContentResolver(), uri);
ऐसा लगता है कि 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)
}
आप इस तरह से यूआरआई से बिटमैप प्राप्त कर सकते हैं
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
e.printStackTrace();
}
नीचे की तरह 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
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 )
}
आप इस संरचना को कर सकते हैं:
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 को बिटमैप में आसानी से बदल सकते हैं। आशा है कि मदद यू
InputStream imageStream = null;
try {
imageStream = getContext().getContentResolver().openInputStream(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
(KOTLIN) तो, 7 अप्रैल, 2020 तक उपरोक्त वर्णित विकल्पों में से किसी ने भी काम नहीं किया, लेकिन यहां मेरे लिए क्या काम किया गया है:
यदि आप बिटमैप को घाटी में संग्रहीत करना चाहते हैं और इसके साथ एक छवि दृश्य सेट करते हैं, तो इसका उपयोग करें:
val bitmap = BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }
यदि आप बिटमैप को और इमेज व्यू में सेट करना चाहते हैं, तो इसका उपयोग करें:
BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }
मोबाइल गैलरी से छवि उरई प्राप्त करने की पूरी विधि।
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();
}
}
}