Url থেকে চিত্র লোড করুন


155

আমার একটি চিত্রের ইউআরএল রয়েছে। আমি এই চিত্রটি ভিউতে এই URL টি থেকে একটি চিত্র প্রদর্শন করতে চাই তবে আমি এটি করতে অক্ষম।

কিভাবে এটা অর্জন করা যেতে পারে?



এই প্রশ্নগুলি দেখুন এবং প্রথম উত্তরের দিকে মনোনিবেশ করুন, এখানে আপনি এটি করার জন্য দুটি সহজ এবং সম্পূর্ণ উপায় খুঁজে পেতে পারেন: প্রথম পদ্ধতি (আরও সম্পূর্ণ) বা দ্বিতীয় পদ্ধতি (আরও সহজভাবে)
lory105

আপনি পিকাসো এবং গ্লাইড চিত্র লোডার ব্যবহার করতে পারেন এবং চিত্র দর্শনে প্রদর্শিত হতে পারেন
shweta c

উত্তর:


239
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464");
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);

60
আপনার সত্যই এটি ব্যবহার করা উচিত নয়, কারণ এটি ইউআই থ্রেডকে ব্লক করে। এই লাইব্রেরিটি আপনার জন্য থ্রেডিং এবং ডাউনলোডিং
छवि

16
আপনি যদি এই ব্লকটি পৃথক থ্রেড বিয়োগের সেটটি চালিয়ে যান সেট ইমেজবিটম্যাপ
জোনাথন

এটির কাজ আমি থাম্বনেইলস এবং অন্লিক চিত্র প্রদর্শনে প্রদর্শন করছি আমি dsplaying dailog ব্যবহার করেছি তবে এটি 10 ​​সেকেন্ড পরে খোলে
প্রসাদ

4
@ কোশ - এই কোডটি একটি মোড়কে থাকলে ঠিক থাকবে AsyncTask
গ্রেগ ব্রাউন

2
আপনার কোনও পৃথক থ্রেডে কোনও নেটওয়ার্ল ক্রিয়াকলাপ করা উচিত, যখন বিটম্যাপটি লোড হয়ে যায়, আপনি ইমেজভিউ.পোস্ট () বা হ্যান্ডলারেরপোস্ট () ব্যবহার করতে পারেন
ভোলডিমিয়ার শালশেনকো

311

উপরের স্বীকৃত উত্তরটি দুর্দান্ত যদি আপনি একটি বোতাম ক্লিকের উপর ভিত্তি করে চিত্রটি লোড করছেন তবে আপনি যদি এটি কোনও নতুন ক্রিয়াকলাপে করছেন তবে এটি ইউআই স্থির করে এক বা দুইয়ের জন্য। আশেপাশে খোঁজ পেয়েছি যে একটি সাধারণ অ্যাসিনটাস্ক এই সমস্যাটি দূর করেছে eliminated

আপনার ক্রিয়াকলাপ শেষে এই শ্রেণিটি যুক্ত করতে একটি অ্যাসিঙ্কটাস্ক ব্যবহার করতে:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
  ImageView bmImage;

  public DownloadImageTask(ImageView bmImage) {
      this.bmImage = bmImage;
  }

  protected Bitmap doInBackground(String... urls) {
      String urldisplay = urls[0];
      Bitmap mIcon11 = null;
      try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
      } catch (Exception e) {
          Log.e("Error", e.getMessage());
          e.printStackTrace();
      }
      return mIcon11;
  }

  protected void onPostExecute(Bitmap result) {
      bmImage.setImageBitmap(result);
  }
}

এবং আপনার অনক্রিট () পদ্ধতিটি ব্যবহার করে কল করুন:

new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
        .execute(MY_URL_STRING);

আপনার ম্যানিফেস্ট ফাইলে নীচে অনুমতি যুক্ত করতে ভুলবেন না

<uses-permission android:name="android.permission.INTERNET"/>

আমার জন্য দুর্দান্ত কাজ করে :)


2
আমি এই সমাধানটি পছন্দ করি, আপনার পোস্টপেক্সেক্সেটের জন্য কেবল কোডআপ সাফ করা উচিত, কারণ এটির শরীর শেষ।
সোফিজা

এটা অসাধারণ. @ সোফিজাকে ক্লিনআপ দিয়ে কী বোঝাতে চাইছেন? আপনার যদি অজানা ছবি আছে?

@ 5er মূল উত্তরটিতে আমার কিছু বন্ধনী ছিল of আমি তখন থেকে এটি পরিষ্কার করে ফেলেছি তাই আপনার এটি যেমনটি ব্যবহার করতে সক্ষম হওয়া উচিত।
কাইল Clegg

ম্যানিফেস্টেও আমাদের অনুমতি যোগ করতে হবে তা ভুলে যাবেন না: <ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.INTERNET" />
mike20132013

1
এটি শিখতে / হ্যাকিংয়ের জন্য দুর্দান্ত (আপভোটেড) তবে যে কোনও উত্পাদনের জন্য আপনার একটি চিত্রলোডার লাইব্রেরি ব্যবহার করা উচিত, সেখানে অনেকগুলি রয়েছে। আমার প্রিয় এক ইউনিভার্সাল ভাবমূর্তি লোডার, পিকাসো ইত্যাদি
AmeyaB

31

picasssoএক বিবৃতিতে সুন্দর চেষ্টা করুন ishes

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).into(imageView);

টিউটোরিয়াল: https://youtu.be/DxRqxsEPc2s


3
পিকাসো, গ্লাইডও আমার প্রিয়। গ্লাইডের বিবৃতিটি পিকাসোর সাথে বেশ অনুরূপ, ক্যাশে আকারে অনেক উন্নতি সহ।
আনহাতুয়ান্দ

এটি নতুন উত্তর হওয়া উচিত, যদিও এটি নিজের নিজের থেকে কীভাবে করা যায় তা জানতে বরাবরই দুর্দান্ত। : গ্রেট নিবন্ধ উভয় উপায় ব্যাখ্যা medium.com/@crossphd/...
মার্টিন Jäkel


7
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import android.widget.Toast;

public class imageDownload {

    Bitmap bmImg;
    void downloadfile(String fileurl,ImageView img)
    {
        URL myfileurl =null;
        try
        {
            myfileurl= new URL(fileurl);

        }
        catch (MalformedURLException e)
        {

            e.printStackTrace();
        }

        try
        {
            HttpURLConnection conn= (HttpURLConnection)myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            int[] bitmapData =new int[length];
            byte[] bitmapData2 =new byte[length];
            InputStream is = conn.getInputStream();
            BitmapFactory.Options options = new BitmapFactory.Options();

            bmImg = BitmapFactory.decodeStream(is,null,options);

            img.setImageBitmap(bmImg);

            //dialog.dismiss();
            } 
        catch(IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
//          Toast.makeText(PhotoRating.this, "Connection Problem. Try Again.", Toast.LENGTH_SHORT).show();
        }


    }


}

আপনার ক্রিয়াকলাপে ইমেজভিউ নিন এবং রিসোর্স ইমেজটি ডাউনলোড করুন ডাউনলোড করুন (ইউআরএল, আপনার আইমেজভিউ);


5

URLIVVHHelper একটি URL- এ পাওয়া একটি চিত্রের সাথে একটি চিত্র ভিউ পূরণ করবে। আরলিগেমভিউহেল্পার সমস্ত চিত্র স্বয়ংক্রিয়ভাবে ডাউনলোড, সংরক্ষণ এবং ক্যাশে সমস্ত চিত্র বিটম্যাপড্রেবেবলকে ইউআরএল করবে। সদৃশ ইউআরএল দু'বার মেমরিতে লোড হবে না। বিটম্যাপ মেমরিটি একটি দুর্বল রেফারেন্স হ্যাশ টেবিল ব্যবহার করে পরিচালনা করা হয়, সুতরাং যত তাড়াতাড়ি চিত্রটি আপনার দ্বারা আর ব্যবহার করা হবে না, এটি স্বয়ংক্রিয়ভাবে আবর্জনা সংগ্রহ করা হবে।

UrlImageViewHelper.setUrlDrawable (চিত্রভিউ, "http://example.com/image.png");

https://github.com/koush/UrlImageViewHelper


4

এই উত্তরের ভিত্তিতে আমি আমার নিজের লোডারটি লিখি।

লোডিং প্রভাব এবং উপস্থিতি প্রভাব সহ:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.InputStream;

/**
 * Created by Sergey Shustikov (pandarium.shustikov@gmail.com) at 2015.
 */
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{
    public static final int ANIMATION_DURATION = 250;
    private final ImageView mDestination, mFakeForError;
    private final String mUrl;
    private final ProgressBar mProgressBar;
    private Animation.AnimationListener mOutAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {

        }

        @Override
        public void onAnimationEnd(Animation animation)
        {
            mProgressBar.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private Animation.AnimationListener mInAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {
            if (isBitmapSet)
                mDestination.setVisibility(View.VISIBLE);
            else
                mFakeForError.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation)
        {

        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private boolean isBitmapSet;

    public DownloadImageTask(Context context, ImageView destination, String url)
    {
        mDestination = destination;
        mUrl = url;
        ViewGroup parent = (ViewGroup) destination.getParent();
        mFakeForError = new ImageView(context);
        destination.setVisibility(View.GONE);
        FrameLayout layout = new FrameLayout(context);
        mProgressBar = new ProgressBar(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        mProgressBar.setLayoutParams(params);
        FrameLayout.LayoutParams copy = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        copy.gravity = Gravity.CENTER;
        copy.width = dpToPx(48);
        copy.height = dpToPx(48);
        mFakeForError.setLayoutParams(copy);
        mFakeForError.setVisibility(View.GONE);
        mFakeForError.setImageResource(android.R.drawable.ic_menu_close_clear_cancel);
        layout.addView(mProgressBar);
        layout.addView(mFakeForError);
        mProgressBar.setIndeterminate(true);
        parent.addView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }

    protected Bitmap doInBackground(String... urls)
    {
        String urlDisplay = mUrl;
        Bitmap bitmap = null;
        try {
            InputStream in = new java.net.URL(urlDisplay).openStream();
            bitmap = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return bitmap;
    }

    protected void onPostExecute(Bitmap result)
    {
        AlphaAnimation in = new AlphaAnimation(0f, 1f);
        AlphaAnimation out = new AlphaAnimation(1f, 0f);
        in.setDuration(ANIMATION_DURATION * 2);
        out.setDuration(ANIMATION_DURATION);
        out.setAnimationListener(mOutAnimationListener);
        in.setAnimationListener(mInAnimationListener);
        in.setStartOffset(ANIMATION_DURATION);
        if (result != null) {
            mDestination.setImageBitmap(result);
            isBitmapSet = true;
            mDestination.startAnimation(in);
        } else {
            mFakeForError.startAnimation(in);
        }
        mProgressBar.startAnimation(out);
    }
    public int dpToPx(int dp) {
        DisplayMetrics displayMetrics = mDestination.getContext().getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }
}

অনুমতি যোগ করুন

<uses-permission android:name="android.permission.INTERNET"/>

এবং কার্যকর:

 new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();

4

URL থেকে প্রদর্শন চিত্রের জন্য নমুনা কোড এখানে।

public static Void downloadfile(String fileurl, ImageView img) {
        Bitmap bmImg = null;
        URL myfileurl = null;
        try {
            myfileurl = new URL(fileurl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn = (HttpURLConnection) myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            if (length > 0) {
                int[] bitmapData = new int[length];
                byte[] bitmapData2 = new byte[length];
                InputStream is = conn.getInputStream();
                bmImg = BitmapFactory.decodeStream(is);
                img.setImageBitmap(bmImg);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3

সেরা পদ্ধতি আমি কোনও লাইব্রেরি ব্যবহার না করে চেষ্টা করেছি

public Bitmap getbmpfromURL(String surl){
    try {
        URL url = new URL(surl);
        HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
        urlcon.setDoInput(true);
        urlcon.connect();
        InputStream in = urlcon.getInputStream();
        Bitmap mIcon = BitmapFactory.decodeStream(in);
        return  mIcon;
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
        return null;
    }
}

3

ম্যানিফেস্টে ইন্টারনেট অনুমতি যুক্ত করুন

<uses-permission android:name="android.permission.INTERNET" />

নীচের মত মিথোড তৈরি করার চেয়ে,

 public static Bitmap getBitmapFromURL(String src) {
    try {
        Log.e("src", src);
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        Log.e("Bitmap", "returned");
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("Exception", e.getMessage());
        return null;
    }
}

এখন আপনার অনক্রিয়েট পদ্ধতিতে এটি যুক্ত করুন,

 ImageView img_add = (ImageView) findViewById(R.id.img_add);


img_add.setImageBitmap(getBitmapFromURL("http://www.deepanelango.me/wpcontent/uploads/2017/06/noyyal1.jpg"));

এটা আমার জন্য কাজ করে।


2

নীচের কোডগুলি আপনাকে কীভাবে একটি ইউআরএল স্ট্রিং থেকে আরএক্সএন্ড্রয়েড ব্যবহার করে ইমেজভিউ সেট করতে হবে তা দেখায়। প্রথমে আরএক্সএন্ড্রয়েড লাইব্রেরি 2.0 যুক্ত করুন

dependencies {
    // RxAndroid
    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.0'

    // Utilities
    compile 'org.apache.commons:commons-lang3:3.5'

}

এখন চিত্র সেট করতে setImageFromUll ব্যবহার করুন।

public void setImageFromUrl(final ImageView imageView, final String urlString) {

    Observable.just(urlString)
        .filter(new Predicate<String>() {
            @Override public boolean test(String url) throws Exception {
                return StringUtils.isNotBlank(url);
            }
        })
        .map(new Function<String, Drawable>() {
            @Override public Drawable apply(String s) throws Exception {
                URL url = null;
                try {
                    url = new URL(s);
                    return Drawable.createFromStream((InputStream) url.getContent(), "profile");
                } catch (final IOException ex) {
                    return null;
                }
            }
        })
        .filter(new Predicate<Drawable>() {
            @Override public boolean test(Drawable drawable) throws Exception {
                return drawable != null;
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<Drawable>() {
            @Override public void accept(Drawable drawable) throws Exception {
                imageView.setImageDrawable(drawable);
            }
        });
}

2

দুটি উপায় আছে:

1) গ্লাইড লাইব্রেরি ব্যবহার করা ইউআরএল থেকে চিত্রটি লোড করার সেরা উপায় কারণ আপনি যখন দ্বিতীয় বার একই ইউআরএল প্রদর্শন করার চেষ্টা করবেন তখন এটি অ্যাপ্লিকেশনটির কার্যকারিতা উন্নত করে ক্যাচ থেকে প্রদর্শিত হবে because

Glide.with(context).load("YourUrl").into(imageView);

নির্ভরতা: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) স্ট্রিম ব্যবহার। এখানে আপনি url চিত্র থেকে বিটম্যাপ তৈরি করতে চান

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);

1
loadImage("http://relinjose.com/directory/filename.png");

আপনি এখানে যান

void loadImage(String image_location) {
    URL imageURL = null;
    if (image_location != null) {
        try {
            imageURL = new URL(image_location);         
            HttpURLConnection connection = (HttpURLConnection) imageURL
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);// Convert to bitmap
            ivdpfirst.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        //set any default
    }
}


এক্সএমএল ডিজাইনে ইমেজভিউয়ের আইডি ব্যবহৃত হয়।
ব্যতিক্রমী

1

এটা চেষ্টা কর:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);

1
public class MainActivity extends Activity {

    Bitmap b;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView)findViewById(R.id.imageView1);
        information info = new information();
        info.execute("");
    }

    public class information extends AsyncTask<String, String, String>
    {
        @Override
        protected String doInBackground(String... arg0) {

            try
            {
                URL url = new URL("http://10.119.120.10:80/img.jpg");
                InputStream is = new BufferedInputStream(url.openStream());
                b = BitmapFactory.decodeStream(is);

            } catch(Exception e){}
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            img.setImageBitmap(b);
        }
    }
}

1

আমার কাছে ফ্রেসকো অন্যান্য লাইব্রেরির মধ্যে সেরা।

কেবল ফ্রেসকো সেটআপ করুন এবং তারপরে ইমেজটি কেবল এটির মতো সেট করুন:

draweeView.setImageURI(uri);

ফ্রেস্কোর কিছু সুবিধা সম্পর্কে ব্যাখ্যা করে এই উত্তরটি দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.