Muat gambar dari url

156

Saya punya URL gambar. Saya ingin menampilkan gambar dari URL ini di ImageView tetapi saya tidak dapat melakukannya.

Bagaimana ini bisa dicapai?

Sanat Pandey
sumber
Kemungkinan duplikat dari Cara memuat ImageView oleh URL di Android?
blahdiblah
lihat pertanyaan-pertanyaan ini dan fokuskan pada jawaban pertama, di sini Anda dapat menemukan dua cara sederhana dan lengkap untuk melakukan ini: metode pertama (lebih lengkap) atau metode kedua (lebih sederhana)
lory105
Anda dapat menggunakan pemuat gambar Picasso dan Glide dan ditampilkan ke imageview
shweta c

Jawaban:

240
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464");
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);
rajath
sumber
60
Anda benar-benar tidak boleh menggunakan itu, karena itu memblokir thread UI. Perpustakaan ini akan menangani threading dan pengunduhan untuk Anda: github.com/koush/UrlImageViewHelper
koush
16
Tidak jika Anda menjalankan blok itu pada utas terpisah minus setImageBitmap
Jonathan
itu berfungsi saya menampilkan thumbnail dan onview klik gambar saya menggunakan dsplaying dailog tetapi terbuka setelah 10 detik
Prasad
4
@koush - Kode ini akan baik-baik saja jika dibungkus dengan AsyncTask.
Greg Brown
2
Anda harus membuat operasi networl di utas terpisah, Ketika bitmap telah dimuat, Anda dapat menggunakan ImageView.post () atau Handler.post ()
Volodymyr Shalashenko
311

Jawaban yang diterima di atas sangat bagus jika Anda memuat gambar berdasarkan klik tombol, namun jika Anda melakukannya dalam kegiatan baru itu membekukan UI untuk satu atau dua detik. Melihat sekeliling saya menemukan bahwa asynctask sederhana menghilangkan masalah ini.

Untuk menggunakan asynctask untuk menambahkan kelas ini di akhir aktivitas Anda:

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);
  }
}

Dan panggil dari metode onCreate () Anda menggunakan:

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

Jangan lupa untuk menambahkan izin di bawah ini dalam file manifes Anda

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

Bekerja bagus untukku. :)

Kyle Clegg
sumber
2
Saya suka solusi ini, Anda hanya perlu membersihkan kode untuk onPostExecute, karena tubuh sudah keluar.
Sofija
ini bagus. @ Sofija apa yang Anda maksud dengan pembersihan? bagaimana jika Anda memiliki jumlah gambar yang tidak diketahui?
5er
@ 5er Saya punya beberapa tanda kurung di tempat pada jawaban aslinya. Sejak itu saya membersihkannya sehingga Anda harus dapat menggunakannya apa adanya.
Kyle Clegg
Tidak lupa bahwa kita juga perlu menambahkan izin dalam manifes: <menggunakan-izin android: name = "android.permission.INTERNET" />
mike20132013
1
Ini luar biasa untuk belajar / meretas (ditingkatkan) tetapi untuk produksi apa pun Anda harus menggunakan perpustakaan Imageloader, ada begitu banyak di luar sana. Yang favorit saya adalah Universal Image loader, Picasso dll.
AmeyaB
31

coba picasssobagus dan selesai dalam satu pernyataan

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

tutorial: https://youtu.be/DxRqxsEPc2s

vijaicv
sumber
3
Picasso, Glide adalah favorit saya juga. Pernyataan Glide sangat mirip dengan Picasso, dengan banyak peningkatan dalam ukuran cache.
anhtuannd
1
Ini harus menjadi jawaban baru, meskipun selalu menyenangkan mengetahui bagaimana melakukannya sendiri. Artikel hebat yang menjelaskan kedua cara: medium.com/@crossphd/…
Martin Jäkel
9

Coba ini tambahkan file jar picasso lib

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).noFade().into(imageView);
Rakesh Rangani
sumber
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();
        }


    }


}

dalam aktivitas Anda ambil imageview & atur resourceDownload (url, yourImageview);


sumber
5

UrlImageViewHelper akan mengisi ImageView dengan gambar yang ditemukan di URL. UrlImageViewHelper akan secara otomatis mengunduh, menyimpan, dan menyimpan semua url gambar di BitmapDrawables. URL duplikat tidak akan dimuat ke memori dua kali. Memori bitmap dikelola dengan menggunakan tabel hash referensi yang lemah, sehingga segera setelah gambar tidak lagi digunakan oleh Anda, itu akan menjadi sampah yang dikumpulkan secara otomatis.

UrlImageViewHelper.setUrlDrawable (imageView, "http://example.com/image.png");

https://github.com/koush/UrlImageViewHelper

koush
sumber
4

Berdasarkan jawaban ini saya menulis loader saya sendiri.

Dengan efek Memuat dan efek Muncul:

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 ([email protected]) 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;
    }
}

Tambahkan izin

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

Dan jalankan:

 new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();
Sergey Shustikov
sumber
4

Berikut ini contoh kode untuk menampilkan Gambar dari 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();
        }
    }
Niranj Patel
sumber
3

Metode Terbaik Saya sudah mencoba daripada menggunakan perpustakaan apa pun

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;
    }
}
Sabari Karthik
sumber
3

tambahkan izin Internet dalam manifes

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

daripada membuat metode seperti di bawah ini,

 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;
    }
}

sekarang tambahkan ini dalam metode onCreate Anda,

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


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

ini bekerja untuk saya.

Jinal Awaiya
sumber
2

Kode di bawah ini menunjukkan kepada Anda cara mengatur ImageView dari string url, menggunakan RxAndroid. Pertama, tambahkan RxAndroid library 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'

}

sekarang gunakan setImageFromUrl untuk mengatur gambar.

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);
            }
        });
}
DàChún
sumber
2

Ada dua cara:

1) Menggunakan pustaka Glide Ini adalah cara terbaik untuk memuat gambar dari url karena ketika Anda mencoba untuk menampilkan url yang sama di kedua kalinya akan menampilkan dari tangkapan sehingga meningkatkan kinerja aplikasi

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

ketergantungan: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Menggunakan Stream. Di sini Anda ingin membuat bitmap dari gambar url

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);
Sanjayrajsinh
sumber
1
loadImage("http://relinjose.com/directory/filename.png");

Ini dia

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
    }
}
Luar biasa
sumber
Apa ivdpfirst?
Big McLargeHuge
Id ImageView digunakan dalam desain xml.
Luar Biasa
1

Coba ini:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);
chung
sumber
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);
        }
    }
}
Rahul Raina
sumber
1

Bagi saya, Fresco adalah yang terbaik di antara perpustakaan lainnya.

Cukup setup Fresco dan kemudian atur imageURI seperti ini:

draweeView.setImageURI(uri);

Lihatlah jawaban ini yang menjelaskan beberapa manfaat Fresco.

Wilder Pereira
sumber