কম্পিউটার টিউটোরিয়াল

Android-এ Glide লাইব্রেরি ব্যবহার করে ইমেজ বিটম্যাপ হিসেবে ডাউনলোড করা

Android-এ Glide লাইব্রেরি ব্যবহার করে ইমেজ বিটম্যাপ হিসেবে ডাউনলোড করা

Glide (by Bump Technologies) হলো একটি দ্রুত এবং কার্যকর ইমেজ লোডিং লাইব্রেরি যা মিডিয়া ডিকোডিং, মেমরি/ডিস্ক ক্যাশিং, এবং রিসোর্স পুলিং অপ্টিমাইজ করে। এটি বিশেষ করে Bitmap অবজেক্ট হিসেবে ইমেজ পাওয়ার জন্য উপযোগী।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন এবং ডিপেন্ডেন্সি যোগ করুন

build.gradle (Module: app) ফাইলে নিম্নলিখিত ডিপেন্ডেন্সিগুলি যোগ করুন:

dependencies {
    // Glide नवীনतम ভার্সন (আপনার Gradle ভার্সন অনুযায়ী)
    implementation 'com.github.bumptech.glide:glide:4.16.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'

    // Kotlin-এ ব্যবহার করলে
    // kapt 'com.github.bumptech.glide:compiler:4.16.0'
}

ধাপ ২: লেআউট ফাইল (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:contentDescription="Glide-এ লোড করা ছবি" />

</RelativeLayout>

ধাপ ৩: MainActivity.java-এ Glide ব্যবহার করে Bitmap-এ লোড করুন

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.target.SimpleTarget;
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);

        String imageUrl = "https://www.google.es/images/srpr/logo11w.png";

        // পদ্ধতি ১: CustomTarget ব্যবহার করে Bitmap পাওয়া (প্রস্তাবিত)
        Glide.with(this)
                .asBitmap() // Bitmap হিসেবে লোড করুন
                .load(imageUrl)
                .into(new CustomTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource,
                                                @Nullable Transition<? super Bitmap> transition) {
                        // Bitmap প্রস্তুত - এখন ইচ্ছেমতো ব্যবহার করুন
                        imageView.setImageBitmap(resource);

                        // উদাহরণ: বিটম্যাপ সংরক্ষণ, শেয়ার করা, বা প্রসেস করা
                        // saveBitmapToFile(resource);
                        Toast.makeText(MainActivity.this, "বিটম্যাপ লোড সম্পন্ন", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
                        // রিসোর্স ক্লিয়ার হলে (যেমন: ভিউ ডিটাচ হলে)
                    }
                });

        // পদ্ধতি ২: SimpleTarget ব্যবহার (পুরানো API, ডিপ্রিকেটেড নয় কিন্তু CustomTarget ভালো)
        /*
        Glide.with(this)
                .asBitmap()
                .load(imageUrl)
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource,
                                                @Nullable Transition<? super Bitmap> transition) {
                        imageView.setImageBitmap(resource);
                    }
                });
        */

        // পদ্ধতি ৩: লিসেনারসহ সরাসরি ImageView-এ লোড (বিটম্যাপ এক্সেস ছাড়া)
        /*
        Glide.with(this)
                .load(imageUrl)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model,
                                                Target<Drawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model,
                                                   Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(imageView);
        */
    }
}

Glide-এ Bitmap লোড করার উন্নত টেকনিক

১. নির্দিষ্ট আকারে Bitmap পাওয়া (ওভারসাইজড ইমেজ এড়াতে)

// কাস্টম আকারে (পিক্সেলে)
Glide.with(this)
        .asBitmap()
        .load(imageUrl)
        .apply(new RequestOptions().override(800, 600)) // मैক্স ৮০০x৬০০
        .into(new CustomTarget<Bitmap>() { ... });

// বা DP-এ (স্ক্রিন ডেন্সিটি অনুযায়ী)
.apply(new RequestOptions().override(
        dpToPx(300), dpToPx(200)
))

২. ট্রান্সফরমেশন প্রয়োগ (বৃত্তাকার, ব্লার, রাউন্ডেড কর্নার)

import com.bumptech.glide.request.RequestOptions;
import jp.wasabeef.glide.transformations.BlurTransformation; // alibrary
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;

// বিল্ট-ইন রাউন্ডেড কর্নার (Glide v4+)
Glide.with(this)
        .asBitmap()
        .load(imageUrl)
        .apply(RequestOptions.bitmapTransform(new RoundedCorners(24))) // ২৪dp রাউন্ডেড
        .into(customTarget);

// থার্ড-পার্টি লাইব্রেরি (glide-transformations) ব্যবহার করে
Glide.with(this)
        .asBitmap()
        .load(imageUrl)
        .apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
        .into(customTarget);

৩. ক্যাশ কন্ট্রোল

// শুধু মেমরি ক্যাশ ব্যবহার করুন
Glide.with(this)
        .asBitmap()
        .load(imageUrl)
        .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE))
        .into(customTarget);

// শুধু ডিস্ক ক্যাশ
.apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.DATA))

// কোনো ক্যাশ না (ফরস রিফ্রেশ)
.apply(new RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true))

৪. থাম্বনেইল লোডিং (দ্রুত প্রিভিউ)

Glide.with(this)
        .asBitmap()
        .load(imageUrl)
        .thumbnail(Glide.with(this).asBitmap().load(thumbnailUrl).apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.ALL)).sizeMultiplier(0.1f))
        .into(customTarget);

৫. প্রিলোডিং (পূর্বে লোড করুন)

// RecyclerView-এ প্রিলোডের জন্য
Glide.with(fragment)
        .asBitmap()
        .load(urls.get(preloadPosition))
        .preload(); // বা .preload(width, height)

গুরুত্বপূর্ণ: কনটেক্সট নির্বাচন (Context vs Activity vs Fragment)

কনটেক্সট লাইফসাইকেল ব্যবহার
Glide.with(activity) Activity লাইফসাইকেল Activity ডেস্ট্রয় হলে অটো ক্যাঞ্চেল
Glide.with(fragment) Fragment লাইফসাইকেল Fragment ডেস্ট্রয় হলে অটো ক্যাঞ্চেল (প্রস্তাবিত)
Glide.with(view) View.attach/detach View ডিটাচ হলে ক্যাঞ্চেল
Glide.with(context) Application লাইফসাইকেল ম্যানুয়াল ক্যাঞ্চেল দরকার, লিক হতে পারে

ধাপ ৪: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Bitmap সংরক্ষণ করা (ফাইলে লিখা)

CustomTarget-এ Bitmap পাওয়ার পর এটি ফাইলে সংরক্ষণ করতে পারেন:

private void saveBitmapToFile(Bitmap bitmap) {
    Executors.newSingleThreadExecutor().execute(() -> {
        try {
            File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "glide_image_" + System.currentTimeMillis() + ".png");
            FileOutputStream fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();

            runOnUiThread(() -> Toast.makeText(this, "ছবি সংরক্ষিত: " + file.getAbsolutePath(), Toast.LENGTH_LONG).show());

            // গ্যালারিতে দেখানোর জন্য মিডিয়া স্ক্যান
            MediaScannerConnection.scanFile(this, new String[]{file.getAbsolutePath()}, null, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}

অ্যাপ্লিকেশন চালানোর পদ্ধতি

আপনার Android ডিভাইস কম্পিউটারের সাথে সংযুক্ত করুন। Android Studio-তে Run আইকনে ক্লিক করুন। Google লোগো Bitmap হিসেবে লোড होकर ImageView-এ দেখাবে।

Android-এ Glide লাইব্রেরি ব্যবহার করে ইমেজ বিটম্যাপ হিসেবে ডাউনলোড করা

  1. অ্যান্ড্রয়েড টুলবারে SearchView ব্যবহার করার পদ্ধতি

  2. অ্যান্ড্রয়েডে URL থেকে ইমেজ ডাউনলোড ও সংরক্ষণ করা

  3. অ্যান্ড্রয়েডে Drawable কে Bitmap-এ রূপান্তর করা

  4. Android-এ Glide লাইব্রেরি ব্যবহার করে ইমেজ বিটম্যাপ হিসেবে ডাউনলোড করা