글라이드를 사용하여 이미지를 비트 맵으로 다운로드하는 방법은 무엇입니까?


141

ImageView글라이드를 사용하여 URL을 다운로드하는 것은 매우 쉽습니다.

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

에 다운로드 할 수 있는지 궁금합니다 Bitmap. 다른 도구를 사용하여 조작 할 수있는 원시 비트 맵으로 다운로드하고 싶습니다. 나는 코드를 겪어 왔으며 그것을하는 방법을 보지 못했습니다.

답변:


176

최신 버전 인지 확인하십시오

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

코 틀린 :

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

비트 맵 크기 :

이미지의 원래 크기를 사용하려면 위와 같이 기본 생성자를 사용하십시오. 그렇지 않으면 원하는 비트 맵 크기를 전달할 수 있습니다

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

자바:

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

기존 답변 :

compile 'com.github.bumptech.glide:glide:4.8.0'아래

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

내용은 compile 'com.github.bumptech.glide:glide:3.7.0'아래

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

이제 경고가 표시 될 수 있습니다 SimpleTarget is deprecated

이유:

SimpleTarget을 더 이상 사용하지 않는 주요 요점은 Glide의 API 계약을 위반하려는 유혹에 대해 경고하는 것입니다. 특히 SimpleTarget이 지워지면로드 한 리소스 사용을 강제로 중지하지 않아도되므로 충돌 및 그래픽 손상이 발생할 수 있습니다.

SimpleTargetimageView가 지워지면 비트 맵을 사용하지 않는 한 여전히 스틸을 사용할 수 있습니다.


10
저는 글라이드 4.0에 있는데 .asBitmap ()을 찾을 수 없습니다
Chris Nevill

8
동기 호출의 경우 Glide.with (this) .asBitmap (). load (pictureUrl) .submit (100, 100) .get ()을 사용하십시오. .setLargeIcon (bitmap)을 통해 알림에 아이콘을 추가하고 싶을 때 유용 할 수 있습니다.
Yazon2006

1
구현 나를 위해이 작업의를 @Max 'com.github.bumptech.glide : 글라이드 : 3.6.1'
Bipin 바르 티

2
@Nux는 최신 버전인지 확인하십시오4.9.0
Max

1
.asBitmap()with(this)해결되지 않은 경우에 넣어야 합니다.
Alston

177

글라이드에 익숙하지 않지만 목표 크기를 알고 있다면 다음과 같이 사용할 수 있습니다.

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

통과 할 수있는 것처럼 보이고 -1,-1전체 크기 이미지를 얻습니다 (순전히 테스트를 기반으로 문서화 된 것을 볼 수 없음).

참고 into(int,int)다시 발생 FutureTarget<Bitmap>하면 취재 시도-catch 블록이 포장 할 수 있도록, ExecutionException그리고 InterruptedException. 테스트되고 작동하는보다 완전한 예제 구현은 다음과 같습니다.

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

아래 주석에서 Monkeyless의 제안에 따라 (그리고 이것은 공식적인 방법 인 것처럼 보입니다 ) SimpleTarget, 선택적으로 override(int,int)코드를 단순화하기 위해 와 함께 사용할 수 있습니다 . 그러나이 경우 정확한 크기를 제공해야합니다 (1 미만의 항목은 허용되지 않음).

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

동일한 이미지가 필요한 경우 @hennry 제안한대로new SimpleTarget<Bitmap>()


4
후세를 들어, 비동기 작업이 필요하지 않습니다, 단지 .override (INT, INT) 및 / 또는 SimpleTarget 사용
샘 주드

2
@Monkeyless 덕분에 귀하의 제안을 포함하도록 답변을 확장했습니다.
외부

33
원래 크기의 비트 맵을 얻으려면 Target.SIZE_ORIGINAL-1 대신 비트 맵의 ​​너비와 높이를 모두 전달 하는 것이 좋습니다.
Alex Bonel

5
다음 SimpleTarget과 같은 매개 변수를 제공하지 않으면 전체 크기 비트 맵 이 표시됩니다.new SimpleTarget<Bitmap>(){....}
Henry

3
Glide 4.0.0+에서 .into (100, 100) 대신 .asBitmap () before.load () 및 .submit (100, 100)을 사용하십시오.
Yazon2006

16

그것은 재정과 같은 Target클래스 또는 같은 구현 중 하나를 BitmapImageViewTarget하고 무시 setResource비트 맵이 갈 수있는 방법이 될 수 캡처 방법을 ...

이것은 테스트되지 않았습니다. :-)

    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
비트 맵이 imageView의 너비 / 높이를 차지하지 않습니까? 원래 변경되지 않은 비트 맵을 얻으려고합니다.
JohnnyLambada

글라이드 4.0.0+의 경우 .asBitmap () before.load ()를 사용하십시오
Saeed

10

최신 정보

이제 우리는 사용해야합니다 Custom Targets

샘플 코드

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

글라이드를 사용하여 이미지를 비트 맵으로 다운로드하는 방법은 무엇입니까?

위의 모든 답변은 정확하지만 구식입니다.

글라이드의 새로운 버전에서 implementation 'com.github.bumptech.glide:glide:4.8.0'

코드에서 아래 오류를 찾을 수 있습니다

  • .asBitmap()사용할 수 없습니다glide:4.8.0

여기에 이미지 설명을 입력하십시오

  • SimpleTarget<Bitmap> 더 이상 사용되지 않습니다

여기에 이미지 설명을 입력하십시오

여기에 해결책이 있습니다

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

.load 전에 asBItmap을 시도해도 오류가 발생하지 않습니다
Vipul Chauhan

당신이 지금 직면하고 발행 할 것을 @Spritzig
Nilesh Rathod

@NileshRathod 그것은 나에게 아무런 아이콘도 표시하지 않고 아이콘을 표시하지 않습니다.
nideba

@NileshRathod 이것에 대한 문제를 발견 했습니까?
nideba

7

이것이 나를 위해 일한 것입니다 : 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

비트 맵 변수에 동적 비트 맵 이미지를 할당하려는 경우

kotlin

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

위의 답변은 저에게 효과가 없었습니다.

.asBitmap 전에 있어야합니다 .load("http://....")


4
.into (100, 100)은 더 이상 사용되지 않습니다 .submit (100, 100)
Yazon2006

왜 활공은 이런 것들을 더 이상 사용하지 않습니까? 그것은 실제로 같은 사용법입니다 ...
kkarakk

2

새 버전 업데이트

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)

오래된 답변

@ outlyer의 대답은 정확하지만 새로운 글라이드 버전에 약간의 변화가 있습니다

내 버전 : 4.7.1

암호:

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

참고 :이 코드는 UI 스레드에서 실행되므로 AsyncTask, Executor 또는 동시성을 위해 @outlyer의 코드와 같은 다른 것을 사용할 수 있습니다. 원래 크기를 얻으려면 Target.SIZE_ORIGINA를 내 코드로 입력하십시오. -1, -1을 사용하지 마십시오


4
SimpleTarget <비트 맵>은 새 버전에서 더 이상 사용되지 않습니다
Nainal

-1

최신 버전 :

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) } }
    })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.