বিটম্যাপে কোনও চিত্র ডাউনলোড করতে কেউ কীভাবে গ্লাইড ব্যবহার করে?


141

একটি ইউআরএল ডাউনলোড করা ImageViewগ্লাইড ব্যবহার করে খুব সহজ:

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'

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

বিটম্যাপ আকার:

আপনি যদি চিত্রটির মূল আকারটি ব্যবহার করতে চান তবে উপরের মতো ডিফল্ট কনস্ট্রাক্টর ব্যবহার করুন, অন্যথায় আপনি বিটম্যাপের জন্য আপনার পছন্দসই আকারটি পাস করতে পারেন

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এখনও যতদিন না পর্যন্ত আপনি নিশ্চিত করুন যে আপনি বিটম্যাপ ব্যবহার করছেন না একবার imageView সাফ হয় না ব্যবহার করা যাবে।


10
আমি গ্লাইড ৪.০ এ আছি এবং .asBitmap () খুঁজে পাচ্ছি না
ক্রিস নেভিল

8
সিঙ্ক্রোনাস কলগুলির জন্য গ্লাইড.উইথ (এটি) .এসবিটম্যাপ ()। লোড (পিকচারউআরএল)। সাবমিট (100, 100) .get () ব্যবহার করুন। আপনি .setLargeIcon (বিটম্যাপ)
Yazon2006

1
@ ম্যাক্স এই কাজটি বাস্তবায়নে আমার পক্ষে 'com.github.bumptech.glide: গ্লাইড: 3.6.1'
বিপিন ভারতী

2
@ নক্স নিশ্চিত করুন যে আপনি সর্বশেষ সংস্করণে 4.9.0
সর্বাধিক

1
.asBitmap()with(this)এটি সমাধান না হলে এটি পরে রাখা উচিত ।
অ্যালস্টন

177

আমি গ্লাইডের সাথে যথেষ্ট পরিচিত নই তবে মনে হচ্ছে আপনি যদি লক্ষ্য আকারটি জানেন তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

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

দেখে মনে হচ্ছে আপনি পাস করতে পারেন -1,-1এবং একটি পূর্ণ আকারের চিত্র পাবেন (পুরোপুরি পরীক্ষার উপর ভিত্তি করে, এটি নথিভুক্ত দেখতে পাচ্ছেন না)।

নোটটি into(int,int)একটি প্রদান করে FutureTarget<Bitmap>, তাই আপনাকে এটি চেষ্টা-ব্লক কভারিং 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();
    }
}

নীচের মন্তব্যে মনকিলেস'র পরামর্শ অনুসরণ করে (এবং এটিও সরকারী উপায় হিসাবে উপস্থিত হবে ), আপনি কোডটি যথেষ্ট সহজ করার জন্য একটি 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()
        }
    });

@ জেনারির পরামর্শ অনুসারে যদি আপনার একই চিত্রের প্রয়োজন হয় তবে ব্যবহার করুনnew SimpleTarget<Bitmap>()


4
উত্তরসূরির জন্য, আপনার অ্যাসিঙ্ক টাস্কের দরকার নেই, কেবলমাত্র ওভাররাইড (ইনট, ইনট) এবং / অথবা একটি সিম্পল টার্গেট ব্যবহার করুন
স্যাম

2
@ মনকিলেস ধন্যবাদ, আমি আপনার পরামর্শটি অন্তর্ভুক্ত করার জন্য আমার উত্তরটি প্রসারিত করেছি।
আউটলিডার

33
আপনি যদি আসল আকারে একটি বিটম্যাপ অর্জন করতে চান তবে Target.SIZE_ORIGINAL-1 এর পরিবর্তে বিটম্যাপের প্রস্থ এবং উচ্চতা উভয়ই পাশ করা ভাল
অ্যালেক্স বোনেল

5
আপনি যদি এর জন্য কোনও পরামিতি সরবরাহ না করেন তবে আপনি পূর্ণ আকারের বিটম্যাপটি পাবেন SimpleTarget:new SimpleTarget<Bitmap>(){....}
হেনরি

3
গ্লাইড 4.0.0+ এ .into (100, 100) এর পরিবর্তে .asBitmap () এর আগে.লোড () এবং .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
বিটম্যাপটি চিত্রের ভিউটির প্রস্থ / উচ্চতা গ্রহণ করবে না? আমি আসল অপ্রচলিত বিটম্যাপটি পাওয়ার আশা করছি।
জনিলম্বদা

গ্লাইড 4.0.0+ এর জন্য .as বিটম্যাপ () এর আগে.লোড () ব্যবহার করুন
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;
    }
}

যদি আপনি .bd এর আগে asbtmap চেষ্টা করেন তবে এটি আপনাকে কোনও ত্রুটি দেয় না
বিপুল চৌহান

@ স্প্রিটজিগ আপনি এখন যে সমস্যার মুখোমুখি হচ্ছেন
নিলেশ

@ নীলেশ রথোদ এটি আমাকে আইকনটি ত্রুটিযুক্ত কিছুই দেখায় না কেবল আইকনটি প্রদর্শন করে না।
নিদেবা

@ নীলেশ রথোদ আপনি কি এর জন্য সমস্যা খুঁজে পেয়েছেন?
নিদেবা

7

এটি আমার জন্য কাজ করেছিল: https://github.com/bumptech/glide/wiki/Custom-targets#overriding-default-behaviour

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) অবচিত ব্যবহার করা হয়েছে। জমা দিন (100, 100)
Yazon2006

চ কেন এই জাতীয় জিনিসগুলিকে হ্রাস করে? এটি ব্যবহারিকভাবে একই ব্যবহার ...
ক্যারাক্ক

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)

পুরানো উত্তর

@ আউটাইয়ের উত্তরটি সঠিক, তবে নতুন গ্লাইড সংস্করণে কিছু পরিবর্তন রয়েছে

আমার সংস্করণ: 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))
                    }
                })

দ্রষ্টব্য: এই কোডটি ইউআই থ্রেডে চালিত হয়, সুতরাং আপনি অ্যাসিঙ্কটাস্ক, নির্বাহক বা চুক্তির জন্য অন্য কিছু ব্যবহার করতে পারেন (যেমন @ আউটলির কোড) আপনি যদি আসল আকার পেতে চান তবে আমার কোড হিসাবে টার্গেট.এসআইজেড.ইআরআইজিআইএনএ রাখুন। -1, -1 ব্যবহার করবেন না


4
সিম্পল টার্গেট <বিটম্যাপ> নতুন সংস্করণে নষ্ট হয়েছে
নৈনাল

-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.