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

অ্যান্ড্রয়েডে Bitmap থেকে গোলাকার (Circular) ছবি কাটা

Canvas, Paint, PorterDuffXfermode ব্যবহার করে গোলাকার Bitmap তৈরি

এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে একটি বর্গাকার/আয়তাকার Bitmap-কে গোলাকার (circular) করতে হয়, 거기에 বর্ডার (Border) এবং শ্যাডো (Shadow) যোগ করতে হয়। কাস্টম View বা ImageView-এ ব্যবহার করা যায়।

ধাপ ১: প্রজেক্ট তৈরি করুন

Android Studio-তে নতুন প্রজেক্ট শুরু করুন।

ধাপ ২: লেআউট (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:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:background="#edf2ea"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:text="গোলাকার করুন" />

</RelativeLayout>

ধাপ ৩: MainActivity.java - সম্পূর্ণ লজিক

package com.example.sample;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private Context context;
    private Resources resources;
    private RelativeLayout rootLayout;
    private Button btnCircle;
    private ImageView imageView;
    private Bitmap bitmap;

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

        context = getApplicationContext();
        resources = getResources();
        rootLayout = findViewById(R.id.rl);
        imageView = findViewById(R.id.iv);
        btnCircle = findViewById(R.id.btn);

        int resId = R.drawable.flower; // আপনার ড্রয়েবল রিসোর্স
        imageView.setImageBitmap(BitmapFactory.decodeResource(resources, resId));

        btnCircle.setOnClickListener(v -> {
            bitmap = BitmapFactory.decodeResource(resources, resId);
            
            // ১. গোলাকার করুন
            bitmap = getCircularBitmap(bitmap);
            
            // ২. বর্ডার যোগ করুন (প্রস্থ ১৫, রঙ সাদা)
            bitmap = addBorderToCircularBitmap(bitmap, 15, Color.WHITE);
            
            // ৩. শ্যাডো যোগ করুন (প্রস্থ ৪, রঙ লাইট গ্রে)
            bitmap = addShadowToCircularBitmap(bitmap, 4, Color.LTGRAY);
            
            imageView.setImageBitmap(bitmap);
        });
    }

    // গোলাকার Bitmap তৈরি
    private Bitmap getCircularBitmap(Bitmap src) {
        int size = Math.min(src.getWidth(), src.getHeight());
        Bitmap dst = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(dst);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        Rect rect = new Rect(0, 0, size, size);
        RectF rectF = new RectF(rect);
        canvas.drawOval(rectF, paint); // গোল আকার আঁকুন
        
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        float left = (size - src.getWidth()) / 2f;
        float top = (size - src.getHeight()) / 2f;
        canvas.drawBitmap(src, left, top, paint); // সোর্স বিটম্যাপ কপি করুন
        
        src.recycle();
        return dst;
    }

    // বর্ডার যোগ করুন
    private Bitmap addBorderToCircularBitmap(Bitmap src, int borderWidth, int borderColor) {
        int dstSize = src.getWidth() + borderWidth * 2;
        Bitmap dst = Bitmap.createBitmap(dstSize, dstSize, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(dst);
        canvas.drawBitmap(src, borderWidth, borderWidth, null);
        
        Paint paint = new Paint();
        paint.setColor(borderColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(borderWidth);
        paint.setAntiAlias(true);
        
        float radius = canvas.getWidth() / 2f - borderWidth / 2f;
        canvas.drawCircle(canvas.getWidth() / 2f, canvas.getHeight() / 2f, radius, paint);
        
        src.recycle();
        return dst;
    }

    // শ্যাডো যোগ করুন
    private Bitmap addShadowToCircularBitmap(Bitmap src, int shadowWidth, int shadowColor) {
        int dstSize = src.getWidth() + shadowWidth * 2;
        Bitmap dst = Bitmap.createBitmap(dstSize, dstSize, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(dst);
        canvas.drawBitmap(src, shadowWidth, shadowWidth, null);
        
        Paint paint = new Paint();
        paint.setColor(shadowColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(shadowWidth);
        paint.setAntiAlias(true);
        
        float radius = dstSize / 2f - shadowWidth / 2f;
        canvas.drawCircle(dstSize / 2f, dstSize / 2f, radius, paint);
        
        src.recycle();
        return dst;
    }
}

প্রধান কনসেপ্ট

  • PorterDuff.Mode.SRC_IN: শুধু সোর্স এবং ডেস্টিনেশন উভয়ই অপেক (opaque) থাকা পিক্সেলগুলো রাখে — এটাই গোলাকার কাটা করে।
  • Anti-aliasing: paint.setAntiAlias(true) করলে প্রান্ত সুস্পষ্ট হয়।
  • recycle(): পুরানো Bitmap মেমরি মুক্ত করতে।

ফলাফল

"গোলাকার করুন" বাটনে ট্যাপ করলে চতুর্ভুজ ছবিটি গোলাকার হবে, সাদা বর্ডার এবং গ্রে শ্যাডো পাবে।

অ্যান্ড্রয়েডে Bitmap থেকে গোলাকার (Circular) ছবি কাটা অ্যান্ড্রয়েডে Bitmap থেকে গোলাকার (Circular) ছবি কাটা অ্যান্ড্রয়েডে Bitmap থেকে গোলাকার (Circular) ছবি কাটা
গোলাকার কাটা + বর্ডার + শ্যাডো
  1. অ্যান্ড্রয়েডে Bitmap কে Drawable-এ রূপান্তর করা

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

  3. অ্যান্ড্রয়েডে ফ্র্যাগমেন্ট থেকে এক্টিভিটি মেথড কল করা

  4. Android-এ সার্কুলার ImageView-এ শ্যাডো এবং বর্ডার যোগ করা