Bir görüntü bir bitmap'e indirmek için nasıl kayar?


141

ImageViewGlide kullanarak bir URL'yi bir URL'ye indirmek çok kolaydır:

Glide
   .with(context)
   .load(getIntent().getData())
   .placeholder(R.drawable.ic_loading)
   .centerCrop()
   .into(imageView);

Ben de bir indirebilir miyim merak ediyorum Bitmap? Daha sonra diğer araçları kullanarak değiştirebileceğim ham bir bitmap'e indirmek istiyorum. Kodun üzerinden geçtim ve nasıl yapılacağını göremiyorum.

Yanıtlar:


176

En Son sürümde olduğunuzdan emin olun

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

Kotlin:

Glide.with(this)
        .asBitmap()
        .load(imagePath)
        .into(object : CustomTarget<Bitmap>(){
            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                imageView.setImageBitmap(resource)
            }
            override fun onLoadCleared(placeholder: Drawable?) {
                // this is called when imageView is cleared on lifecycle call or for
                // some other reason.
                // if you are referencing the bitmap somewhere else too other than this imageView
                // clear it here as you can no longer have the bitmap
            }
        })

Bitmap Boyutu:

görüntünün orijinal boyutunu kullanmak istiyorsanız yukarıdaki gibi varsayılan yapıcıyı kullanın, başka bitmap için istediğiniz boyutu iletebilirsiniz

into(object : CustomTarget<Bitmap>(1980, 1080)

Java:

Glide.with(this)
        .asBitmap()
        .load(path)
        .into(new CustomTarget<Bitmap>() {
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
            }

            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {
            }
        });

Eski Cevap:

İle compile 'com.github.bumptech.glide:glide:4.8.0've altı

Glide.with(this)
        .asBitmap()
        .load(path)
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
            }
        });

İçin compile 'com.github.bumptech.glide:glide:3.7.0'aşağıda

Glide.with(this)
        .load(path)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                imageView.setImageBitmap(resource);
            }
        });

Şimdi bir uyarı görebilirsiniz SimpleTarget is deprecated

Sebep:

SimpleTarget'ı kullanımdan kaldırmanın ana noktası, sizi Glide'ın API sözleşmesini kırmanın yolları hakkında uyarmaktır. Özellikle, SimpleTarget temizlendikten sonra yüklediğiniz herhangi bir kaynağı kullanmayı durdurmaya zorlamak için hiçbir şey yapmaz, bu da çökmelere ve grafik bozulmasına yol açabilir.

SimpleTargetZamandır imageview giderildikten sonra emin bit eşlem kullanmıyorsanız yaptıkça hala kullanılabilir.


10
Glide 4.0 kullanıyorum ve .asBitmap ()
Chris Nevill

8
Senkronize çağrılar için Glide.with (this) .asBitmap (). Load (pictureUrl) .submit (100, 100) .get () kullanın. .SetLargeIcon (bitmap) aracılığıyla bildirimde simge eklemek istediğinizde yararlı olabilir
Yazon2006

1
@Max bu iş benim için uygulamada 'com.github.bumptech.glide: glide: 3.6.1'
Bipin Bharti

2
@Nux en son sürümde olduğunuzdan emin olun4.9.0
Max

1
.asBitmap()with(this)çözülmediyse daha sonra konulmalıdır .
Alston

177

Glide'a yeterince aşina değilim, ancak hedef boyutu biliyorsanız, böyle bir şey kullanabilirsiniz:

Bitmap theBitmap = Glide.
        with(this).
        load("http://....").
        asBitmap().
        into(100, 100). // Width and height
        get();

Geçebilir -1,-1ve tam boyutlu bir görüntü elde edebilirsiniz (sadece testlere dayanır, belgelendirilemez).

Not a into(int,int)döndürür FutureTarget<Bitmap>, bu yüzden bunu bir try-catch blok kaplamasına sarmanız gerekir ExecutionExceptionve InterruptedException. Test edilmiş ve çalışan daha eksiksiz bir örnek uygulama:

class SomeActivity extends Activity {

    private Bitmap theBitmap = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // onCreate stuff ...
        final ImageView image = (ImageView) findViewById(R.id.imageView);

        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                Looper.prepare();
                try {
                    theBitmap = Glide.
                        with(SomeActivity.this).
                        load("https://www.google.es/images/srpr/logo11w.png").
                        asBitmap().
                        into(-1,-1).
                        get();
                 } catch (final ExecutionException e) {
                     Log.e(TAG, e.getMessage());
                 } catch (final InterruptedException e) {
                     Log.e(TAG, e.getMessage());
                 }
                 return null;
            }
            @Override
            protected void onPostExecute(Void dummy) {
                if (null != theBitmap) {
                    // The full bitmap should be available here
                    image.setImageBitmap(theBitmap);
                    Log.d(TAG, "Image loaded");
                };
            }
        }.execute();
    }
}

Aşağıdaki yorumda Maymunsuz 'önerisini izleyerek (ve bu da resmi bir yol gibi görünüyor ), kodu önemli ölçüde basitleştirmek için SimpleTargetisteğe bağlı olarak birleştirilmiş bir kullanabilirsiniz override(int,int). Ancak, bu durumda tam boyut sağlanmalıdır (1'in altındaki herhangi bir şey kabul edilmez):

Glide
    .with(getApplicationContext())
    .load("https://www.google.es/images/srpr/logo11w.png")
    .asBitmap()
    .into(new SimpleTarget<Bitmap>(100,100) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            image.setImageBitmap(resource); // Possibly runOnUiThread()
        }
    });

Aynı görüntüye ihtiyacınız varsa @hennry tarafından önerildiği gibi şunu kullanın:new SimpleTarget<Bitmap>()


4
Gelecek nesiller için zaman uyumsuz görevlere ihtiyacınız yoktur, sadece .override (int, int) ve / veya SimpleTarget kullanın
Sam Judd

2
@Monkeyless teşekkürler, cevabınızı önerinizi içerecek şekilde genişlettim.
outlyer

33
Orijinal boyutta bir bitmap elde etmek istiyorsanız Target.SIZE_ORIGINAL, -1 yerine bitmap'in hem genişliği hem de yüksekliği için geçmek daha iyidir
Alex Bonel

5
Bunun için herhangi bir parametre sağlamazsanız tam boyutlu bitmap'i alırsınız SimpleTarget:new SimpleTarget<Bitmap>(){....}
Henry

3
Glide 4.0.0+ sürümünde .into (100, 100) yerine .asBitmap () ve .submit (100, 100) kullanın
Yazon2006

16

Bu geçersiz kılma gibi görünen Targetsınıf veya benzeri uygulamaların birini BitmapImageViewTargetve geçersiz kılma setResourcebitmap gitmek için bir yol olabilir yakalamak için yöntem ...

Bu denenmemiş. :-)

    Glide.with(context)
         .load("http://goo.gl/h8qOq7")
         .asBitmap()
         .into(new BitmapImageViewTarget(imageView) {
                     @Override
                     protected void setResource(Bitmap resource) {
                         // Do bitmap magic here
                         super.setResource(resource);
                     }
         });

3
Bitmap, imageView'in genişliğini / yüksekliğini almayacak mı? Orijinal değiştirilmemiş Bitmap'i almayı umuyorum.
JohnnyLambada

Glide 4.0.0+ için .asBitmap () before.load () kullanın
Saeed

10

GÜNCELLEME

Şimdi kullanmalıyız Custom Targets

BASİT KOD

    Glide.with(mContext)
            .asBitmap()
            .load("url")
            .into(new CustomTarget<Bitmap>() {
                @Override
                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {

                }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {
                }
            });

Bir görüntü bir bitmap'e indirmek için nasıl kayar?

Her şeyden önce cevap doğru ama modası geçmiş

çünkü Glide'ın yeni versiyonunda implementation 'com.github.bumptech.glide:glide:4.8.0'

Kodda aşağıdaki hatayı bulacaksınız

  • .asBitmap()Mevcut değildirglide:4.8.0

resim açıklamasını buraya girin

  • SimpleTarget<Bitmap> kullanımdan kaldırıldı

resim açıklamasını buraya girin

İşte çözüm

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.Request;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition;



public class MainActivity extends AppCompatActivity {

    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.imageView);

        Glide.with(this)
                .load("")
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE))
                .into(new Target<Drawable>() {
                    @Override
                    public void onLoadStarted(@Nullable Drawable placeholder) {

                    }

                    @Override
                    public void onLoadFailed(@Nullable Drawable errorDrawable) {

                    }

                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

                        Bitmap bitmap = drawableToBitmap(resource);
                        imageView.setImageBitmap(bitmap);
                        // now you can use bitmap as per your requirement
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {

                    }

                    @Override
                    public void getSize(@NonNull SizeReadyCallback cb) {

                    }

                    @Override
                    public void removeCallback(@NonNull SizeReadyCallback cb) {

                    }

                    @Override
                    public void setRequest(@Nullable Request request) {

                    }

                    @Nullable
                    @Override
                    public Request getRequest() {
                        return null;
                    }

                    @Override
                    public void onStart() {

                    }

                    @Override
                    public void onStop() {

                    }

                    @Override
                    public void onDestroy() {

                    }
                });

    }

    public static Bitmap drawableToBitmap(Drawable drawable) {

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        int width = drawable.getIntrinsicWidth();
        width = width > 0 ? width : 1;
        int height = drawable.getIntrinsicHeight();
        height = height > 0 ? height : 1;

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);

        return bitmap;
    }
}

Daha önce .load denemeden denerseniz size herhangi bir hata vermeyecektir
Vipul Chauhan

Şimdi karşı karşıya sorunu nedir @Spritzig
Nilesh Rathod

@NileshRathod Bana simge hata göstermiyor hiçbir şey ama sadece simge göstermiyor.
nideba

@NileshRathod Bunun için bir sorun mu buldunuz?
nideba

7

Benim için bu işe yaradı: https://github.com/bumptech/glide/wiki/Custom-targets#overriding-default-behavior

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.request.target.BitmapImageViewTarget;

...

Glide.with(yourFragment)
  .load("yourUrl")
  .asBitmap()
  .into(new BitmapImageViewTarget(yourImageView) {
    @Override
    public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> anim) {
        super.onResourceReady(bitmap, anim);
        Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {  
            @Override
            public void onGenerated(Palette palette) {
                // Here's your generated palette
                Palette.Swatch swatch = palette.getDarkVibrantSwatch();
                int color = palette.getDarkVibrantColor(swatch.getTitleTextColor());
            }
        });
    }
});

4

Bitmap değişkenlerine dinamik bitmap görüntüsü atamak istiyorsanız

İçin örnek kotlin

backgroundImage = Glide.with(applicationContext).asBitmap().load(PresignedUrl().getUrl(items!![position].img)).into(100, 100).get();

Yukarıdaki cevaplar benim için işe yaramadı

.asBitmap öncesinde olmalı .load("http://....")


4
.into (100, 100) kullanımdan kaldırılmıştır .submit (100, 100)
Yazon2006

Neden f bu gibi şeyleri kayar? neredeyse aynı kullanım ...
kkarakk

2

YENİ SÜRÜM İÇİN GÜNCELLEME

Glide.with(context.applicationContext)
    .load(url)
    .listener(object : RequestListener<Drawable> {
        override fun onLoadFailed(
            e: GlideException?,
            model: Any?,
            target: Target<Drawable>?,
            isFirstResource: Boolean
        ): Boolean {
            listener?.onLoadFailed(e)
            return false
        }

        override fun onResourceReady(
            resource: Drawable?,
            model: Any?,
            target: com.bumptech.glide.request.target.Target<Drawable>?,
            dataSource: DataSource?,
            isFirstResource: Boolean
        ): Boolean {
            listener?.onLoadSuccess(resource)
            return false
        }

    })
    .into(this)

ESKİ CEVAP

@ outlyer'ın yanıtı doğru, ancak yeni Glide sürümünde bazı değişiklikler var

Sürümüm: 4.7.1

Kod:

 Glide.with(context.applicationContext)
                .asBitmap()
                .load(iconUrl)
                .into(object : SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
                    override fun onResourceReady(resource: Bitmap, transition: com.bumptech.glide.request.transition.Transition<in Bitmap>?) {
                        callback.onReady(createMarkerIcon(resource, iconId))
                    }
                })

Not: Bu kod UI İş Parçacığında çalışır, bu nedenle eşzamanlılık için AsyncTask, Executor veya başka bir şey kullanabilirsiniz (@ outlyer's code gibi) Orijinal boyutu almak istiyorsanız, Target.SIZE_ORIGINA kodum olarak koyun. -1, -1 kullanma


4
SimpleTarget <Bitmap> yeni sürümde kullanımdan kaldırıldı
Nainal

-1

Daha yeni versiyon:

GlideApp.with(imageView)
    .asBitmap()
    .override(200, 200)
    .centerCrop()
    .load(mUrl)
    .error(R.drawable.defaultavatar)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .signature(ObjectKey(System.currentTimeMillis() / (1000*60*60*24))) //refresh avatar cache every day
    .into(object : CustomTarget<Bitmap>(){
        override fun onLoadCleared(placeholder: Drawable?) {}
        override fun onLoadFailed(errorDrawable: Drawable?) {
            //add context null check in case the user left the fragment when the callback returns
            context?.let { imageView.addImage(BitmapFactory.decodeResource(resources, R.drawable.defaultavatar)) }
        }
        override fun onResourceReady(
            resource: Bitmap,
            transition: Transition<in Bitmap>?) { context?.let { imageView.addImage(resource) } }
    })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.