Ich habe eine Frage zum Laden eines Bildes von einer Website. Der Code, den ich benutze, ist:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Bitmap bit=null;
try {
bit = BitmapFactory.decodeStream((InputStream)new URL("http://www.mac-wallpapers.com/bulkupload/wallpapers/Apple%20Wallpapers/apple-black-logo-wallpaper.jpg").getContent());
} catch (Exception e) {}
Bitmap sc = Bitmap.createScaledBitmap(bit,width,height,true);
canvas.drawBitmap(sc,0,0,null);
Es wird jedoch immer eine Nullzeigerausnahme zurückgegeben, und das Programm stürzt ab. Die URL ist gültig und scheint für alle anderen zu funktionieren. Ich benutze 2.3.1.
<uses-permission android:name="android.permission.INTERNET" />
zu androidmanifest.xmlAntworten:
public static Bitmap getBitmapFromURL(String src) { try { URL url = new URL(src); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); return myBitmap; } catch (IOException e) { // Log exception return null; } }
quelle
Wenn Sie Picasso oder Glide oder Universal-Image-Loader zum Laden des Bildes von der URL verwenden.
Sie können die geladene Bitmap einfach von abrufen
Für Picasso (aktuelle Version
2.71828
)Java-Code
Picasso.get().load(imageUrl).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // loaded bitmap is here (bitmap) } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} });
Kotlin-Code
Picasso.get().load(url).into(object : com.squareup.picasso.Target { override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { // loaded bitmap is here (bitmap) } override fun onPrepareLoad(placeHolderDrawable: Drawable?) {} override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {} })
For Glide
Check Wie verwendet man Glide, um ein Bild in eine Bitmap herunterzuladen?
Für Universal-Image-Loader
Java-Code
imageLoader.loadImage(imageUrl, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // loaded bitmap is here (loadedImage) } });
quelle
Ich bevorzuge diese:
Erstellt eine Bitmap aus InputStream und gibt sie zurück:
public static Bitmap downloadImage(String url) { Bitmap bitmap = null; InputStream stream = null; BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inSampleSize = 1; try { stream = getHttpConnection(url); bitmap = BitmapFactory.decodeStream(stream, null, bmOptions); stream.close(); } catch (IOException e1) { e1.printStackTrace(); System.out.println("downloadImage"+ e1.toString()); } return bitmap; } // Makes HttpURLConnection and returns InputStream public static InputStream getHttpConnection(String urlString) throws IOException { InputStream stream = null; URL url = new URL(urlString); URLConnection connection = url.openConnection(); try { HttpURLConnection httpConnection = (HttpURLConnection) connection; httpConnection.setRequestMethod("GET"); httpConnection.connect(); if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { stream = httpConnection.getInputStream(); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("downloadImage" + ex.toString()); } return stream; }
MERKEN :
/** AsyncTAsk for Image Bitmap */ private class AsyncGettingBitmapFromUrl extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... params) { System.out.println("doInBackground"); Bitmap bitmap = null; bitmap = AppMethods.downloadImage(params[0]); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { System.out.println("bitmap" + bitmap); } }
quelle
public Drawable loadImageFromURL(String url, String name) { try { InputStream is = (InputStream) new URL(url).getContent(); Drawable d = Drawable.createFromStream(is, name); return d; } catch (Exception e) { return null; } }
quelle
Folgen Sie der Methode, um die URL zur Bitmap in Android zu erhalten. Übergeben Sie einfach den Link dieses Bildes und rufen Sie die Bitmap ab.
public static Bitmap getBitmapFromURL(String imgUrl) { try { URL url = new URL(imgUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); return myBitmap; } catch (IOException e) { // Log exception return null; } }
quelle
Es funktioniert in Pie OS Verwenden Sie dies
@Override protected void onCreate() { super.onCreate(); //setNotificationBadge(); if (android.os.Build.VERSION.SDK_INT >= 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } } BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.navigation); Menu menu = bottomNavigationView.getMenu(); MenuItem userImage = menu.findItem(R.id.navigation_download); userImage.setTitle("Login"); runOnUiThread(new Runnable() { @Override public void run() { try { URL url = new URL("https://rukminim1.flixcart.com/image/832/832/jmux18w0/mobile/b/g/n/mi-redmi-6-mzb6387in-original-imaf9z8eheryfbsu.jpeg?q=70"); Bitmap myBitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); Log.e("keshav", "Bitmap " + myBitmap); userImage.setIcon(new BitmapDrawable(getResources(), myBitmap)); } catch (IOException e) { Log.e("keshav", "Exception " + e.getMessage()); } } });
quelle
Verwenden Sie Kotlin Coroutines, um das Einfädeln zu handhaben
Der Grund, warum der Code abstürzt, liegt darin, dass
Bitmap
versucht wird, auf dem Code zu erstellen, derMain Thread
nicht zulässig ist, da dies zu ANR- Fehlern (Android Not Responding) führen kann.Verwendete Konzepte
toBitmap()
ist eine Kotlin Erweiterungsfunktion der Bibliothek benötigt , um die App Abhängigkeiten hinzugefügt werden.Implementierung
Code
1. Erstellen Sie
Bitmap
in einem anderen Thread als demMain Thread
.In diesem Beispiel mit Kotlin Coroutines wird die Funktion in dem
Dispatchers.IO
Thread ausgeführt, der für CPU-basierte Operationen vorgesehen ist. Der Funktion wirdsuspend
eine Coroutine- Syntax vorangestellt .Bonus - Nachdem das
Bitmap
erstellt wurde, wird es auch zu einem komprimiert,ByteArray
sodass es über einIntent
später in diesem vollständigen Beispiel beschriebenes übergeben werden kann .Repository.kt
suspend fun bitmapToByteArray(url: String) = withContext(Dispatchers.IO) { MutableLiveData<Lce<ContentResult.ContentBitmap>>().apply { postValue(Lce.Loading()) postValue(Lce.Content(ContentResult.ContentBitmap( ByteArrayOutputStream().apply { try { BitmapFactory.decodeStream(URL(url).openConnection().apply { doInput = true connect() }.getInputStream()) } catch (e: IOException) { postValue(Lce.Error(ContentResult.ContentBitmap(ByteArray(0), "bitmapToByteArray error or null - ${e.localizedMessage}"))) null }?.compress(CompressFormat.JPEG, BITMAP_COMPRESSION_QUALITY, this) }.toByteArray(), ""))) } }
ViewModel.kt
//Calls bitmapToByteArray from the Repository private fun bitmapToByteArray(url: String) = liveData { emitSource(switchMap(repository.bitmapToByteArray(url)) { lce -> when (lce) { is Lce.Loading -> liveData {} is Lce.Content -> liveData { emit(Event(ContentResult.ContentBitmap(lce.packet.image, lce.packet.errorMessage))) } is Lce.Error -> liveData { Crashlytics.log(Log.WARN, LOG_TAG, "bitmapToByteArray error or null - ${lce.packet.errorMessage}") } } }) }
Bonus -
ByteArray
Zurück konvertieren zuBitmap
.Utils.kt
fun ByteArray.byteArrayToBitmap(context: Context) = run { BitmapFactory.decodeByteArray(this, BITMAP_OFFSET, size).run { if (this != null) this // In case the Bitmap loaded was empty or there is an error I have a default Bitmap to return. else AppCompatResources.getDrawable(context, ic_coinverse_48dp)?.toBitmap() } }
quelle
Übergeben Sie Ihre Bild-URL: Versuchen Sie Folgendes:
private Bitmap getBitmap(String url) { File file=fileCache.getFile(url); Bitmap bm = decodeFile(file); if(bm!=null) return bm; try { Bitmap bitmap=null; URL ImageUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection)ImageUrl.openConnection(); conn.setConnectTimeout(50000); conn.setReadTimeout(50000); conn.setInstanceFollowRedirects(true); InputStream is = conn.getInputStream(); OutputStream os = new FileOutputStream(file); Utils.CopyStream(is, os); os.close(); bitmap = decodeFile(file); return bitmap; } catch (Exception ex){ ex.printStackTrace(); return null; } } private Bitmap decodeFile(File file){ try { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(file),null,opt); final int REQUIRED_SIZE=70; int width_tmp=opt.outWidth, height_tmp=opt.outHeight; int scale=1; while(true){ if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) break; width_tmp/=2; height_tmp/=2; scale*=2; } BitmapFactory.Options opte = new BitmapFactory.Options(); opte.inSampleSize=scale; return BitmapFactory.decodeStream(new FileInputStream(file), null, opte); } catch (FileNotFoundException e) {} return null; }
Klassen-Utils erstellen:
public class Utils { public static void CopyStream(InputStream is, OutputStream os) { final int buffer_size=1024; try { byte[] bytes=new byte[buffer_size]; for(;;) { int count=is.read(bytes, 0, buffer_size); if(count==-1) break; os.write(bytes, 0, count); } } catch(Exception ex){} } }
quelle
Diese Methode führt den Trick mit Kotlin Coroutine aus, sodass der UI-Hauptthread nicht blockiert wird und ein Bitmap-Bild mit geänderter Kreisgröße (wie Profilbild) zurückgegeben wird.
private var image: Bitmap? = null private fun getBitmapFromURL(src: String?) { CoroutineScope(Job() + Dispatchers.IO).launch { try { val url = URL(src) val bitMap = BitmapFactory.decodeStream(url.openConnection().getInputStream()) image = Bitmap.createScaledBitmap(bitMap, 100, 100, true) } catch (e: IOException) { // Log exception } } }
quelle
Versuche dies:
AQuery aq = new AQuery(getActivity()); aq.id(view.findViewById(R.id.image)).image(imageUrl, true, true, 0, 0, new BitmapAjaxCallback() { @Override public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status){ iv.setImageBitmap(bm); } }.header("User-Agent", "android"));
quelle
Glide.with(context) .load("http://test.com/yourimage.jpg") .asBitmap() // переводим его в нужный формат .fitCenter() .into(new SimpleTarget<Bitmap>(100,100) { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) { // do something with you bitmap bitmap } });
quelle
sehr schnell funktioniert diese Methode sehr schnell:
private Bitmap getBitmap(String url) { File f=fileCache.getFile(url); //from SD cache Bitmap b = decodeFile(f); if(b!=null) return b; //from web try { Bitmap bitmap=null; URL imageUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(true); InputStream is=conn.getInputStream(); OutputStream os = new FileOutputStream(f); Utils.CopyStream(is, os); os.close(); bitmap = decodeFile(f); return bitmap; } catch (Exception ex){ ex.printStackTrace(); return null; } } //decodes image and scales it to reduce memory consumption private Bitmap decodeFile(File f){ try { //decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f),null,o); //Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE=70; int width_tmp=o.outWidth, height_tmp=o.outHeight; int scale=1; while(true){ if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) break; width_tmp/=2; height_tmp/=2; scale*=2; } //decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize=scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) {} return null; }
quelle
public static Bitmap getImgBitmapFromUri(final String url, final Activity context, final CropImageView imageView, final File file) { final Bitmap bitmap = null; AsyncTask.execute(new Runnable() { @Override public void run() { try { Utils.image = Glide.with(context) .load(url).asBitmap() .into(100, 100).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } context.runOnUiThread(new Runnable() { @Override public void run() { if (imageView != null) imageView.setImageBitmap(Utils.image); } }); } }); return Utils.image; }
Verwenden Sie die Glide-Bibliothek und führen Sie den folgenden Code wie angegeben im Arbeitsthread aus
quelle
Bitte versuchen Sie die folgenden Schritte.
1) Erstellen Sie AsyncTask in der Klasse oder im Adapter (wenn Sie das Listenelementbild ändern möchten).
public class AsyncTaskLoadImage extends AsyncTask<String, String, Bitmap> { private final static String TAG = "AsyncTaskLoadImage"; private ImageView imageView; public AsyncTaskLoadImage(ImageView imageView) { this.imageView = imageView; } @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; try { URL url = new URL(params[0]); bitmap = BitmapFactory.decodeStream((InputStream) url.getContent()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { try { int width, height; height = bitmap.getHeight(); width = bitmap.getWidth(); Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmpGrayscale); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f); c.drawBitmap(bitmap, 0, 0, paint); imageView.setImageBitmap(bmpGrayscale); } catch (Exception e) { e.printStackTrace(); } } }
2) Rufen Sie die AsyncTask von Ihrer Aktivität, Ihrem Fragment oder Adapter aus (in onBindViewHolder) auf.
2.a) Für Adapter:
String src = current.getProductImage(); new AsyncTaskLoadImage(holder.icon).execute(src);
2.b) Für Aktivität und Fragment:
**Activity:** ImageView imagview= (ImageView) findViewById(R.Id.imageview); String src = (your image string); new AsyncTaskLoadImage(imagview).execute(src); **Fragment:** ImageView imagview= (ImageView)view.findViewById(R.Id.imageview); String src = (your image string); new AsyncTaskLoadImage(imagview).execute(src);
3) Führen Sie bitte die App aus und überprüfen Sie das Bild.
Viel Spaß beim Codieren .... :)
quelle
Wenn Sie Picasso für Bilder verwenden, können Sie die folgende Methode ausprobieren!
public static Bitmap getImageBitmapFromURL(Context context, String imageUrl){ Bitmap imageBitmap = null; try { imageBitmap = new AsyncTask<Void, Void, Bitmap>() { @Override protected Bitmap doInBackground(Void... params) { try { int targetHeight = 200; int targetWidth = 200; return Picasso.with(context).load(String.valueOf(imageUrl)) //.resize(targetWidth, targetHeight) .placeholder(R.drawable.raw_image) .error(R.drawable.raw_error_image) .get(); } catch (IOException e) { e.printStackTrace(); } return null; } }.execute().get(); } catch (InterruptedException e) { e.printStackTrace(); } return imageBitmap; }
quelle
Wenn Sie Glide und Kotlin verwenden ,
Glide.with(this) .asBitmap() .load("https://...") .addListener(object : RequestListener<Bitmap> { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean ): Boolean { Toast.makeText(this@MainActivity, "failed: " + e?.printStackTrace(), Toast.LENGTH_SHORT).show() return false } override fun onResourceReady( resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { //image is ready, you can get bitmap here var bitmap = resource return false } }) .into(imageView)
quelle
fun getBitmap(url : String?) : Bitmap? { var bmp : Bitmap ? = null Picasso.get().load(url).into(object : com.squareup.picasso.Target { override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { bmp = bitmap } override fun onPrepareLoad(placeHolderDrawable: Drawable?) {} override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {} }) return bmp }
Versuchen Sie dies mit Picasso
quelle
private class AsyncTaskRunner extends AsyncTask<String, String, String> { String Imageurl; public AsyncTaskRunner(String Imageurl) { this.Imageurl = Imageurl; } @Override protected String doInBackground(String... strings) { try { URL url = new URL(Imageurl); thumbnail_r = BitmapFactory.decodeStream(url.openConnection().getInputStream()); } catch (IOException e) { } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); imgDummy.setImageBitmap(thumbnail_r); UtilityMethods.tuchOn(relProgress); } }
Rufen Sie asynctask wie folgt auf:
AsyncTaskRunner asyncTaskRunner = new AsyncTaskRunner(uploadsModel.getImages()); asyncTaskRunner.execute();
quelle
Wenn Sie eine URL aus der Bitmap laden, ohne AsyncTask zu verwenden, schreiben Sie zwei Zeilen nach setContentView (R.layout.abc).
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); try { URL url = new URL("http://...."); Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); } catch(IOException e) { System.out.println(e); }
quelle