এন্ড্রয়েড ইমেজ প্রসেসিং – ইমেজ সিলেক্ট, ইমেজ প্রসেসিং এবং শেষে গ্যালারিতে সেভ করা

আগের ইমেজ প্রসেসিং টিউটোরিয়াল গুলোতে দেখেছি কিভাবে গ্যালারি থেকে একটি ইমেজ নিতে হয়, কিভাবে ইমেজের উপর ইফেক্ট দিতে হয়, এখন বাকি হচ্ছে ইমেজ নিয়ে কাজ করার পর তা আবার গ্যালারিতে সেভ করতে হয়। সেভ করা ভয়াবহ রকম সোজা।
একট লাইনেই সেভ হয়ে যায় নিচের লাইনটি সেভ করতে ব্যবহার করতে পারিঃ

MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "New Image", "Nothing special");

কোড গুলো পড়লেই বুঝা যায় কোনটা কি করছে, তাই আর ব্যাখ্যা করলাম না।

এ লেখায় এক সাথে আমরা একটি ইমেজ আমরা গ্যালারি থেকে নিব, তারপর ইমেজটিকে ইনভার্ট করব [আপনি চাইলে যে কোন ইফেক্ট দিতে পারেন] এবং শেষে সেভ করব গ্যালারিতে।

image save to disk android
অ্যাপটি যেমন দেখাবে

তার জন্য আমাদের দুইটি বাটন লাগবে, একটি ইমেজ ওপেন করতে সিলেক্ট করার জন্য, একটি ইমেজ সেভ করার জন্য। এবং একটি ইমেজ ভিউ। যেখানে আমাদের ইমেজটি দেখাবো। ডিফল্টে আমরা এন্ড্রয়েড আইকন সেট করে রেখেছি।
activity_main.xml টিঃ

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button android:text="Select Image"
        android:id="@+id/button1"
        android:onClick="pickImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="save Image"
        android:id="@+id/save"
        android:layout_gravity="right"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <ImageView
        android:id="@+id/result"
        android:src="@drawable/ic_launcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/button1">
     </ImageView>
</RelativeLayout>

ইমেজ রিড এবং রাইট করার জন্য আমাদের নিচের পারমিশনটা AndroidManifest.xml এ যুক্ত করে দিতে হবে।

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

এখানে আমরা নতুন করে কিছুই করি নি। আগের শেখা কোড গুলো সব গুলো এক সাথ করেছি মাত্র। আগের লেখা গুলো এখান থেকে দেখে নেওয়া যাবেঃ

জাভা কোড গুলোঃ

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends Activity {
    private static final int REQUEST_CODE = 1;
    private Bitmap bitmap;
    private ImageView imageView;
    Button save;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.result);


// saving to gallery
        save = (Button)findViewById(R.id.save);
        save.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "New Image", "Nothing special");


            }
        });



    }


    // intent for pic image

    public void pickImage(View View) {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
            try {

                if (bitmap != null) {
                    bitmap.recycle();
                }
                InputStream stream = getContentResolver().openInputStream(
                        data.getData());
                bitmap = BitmapFactory.decodeStream(stream);
                stream.close();

                bitmap = invertImage(bitmap);

                imageView.setImageBitmap(bitmap);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        super.onActivityResult(requestCode, resultCode, data);
    }


// Invert Image Method
    public static Bitmap invertImage(Bitmap original) {

        Bitmap finalImage = Bitmap.createBitmap(original.getWidth(), original.getHeight(), original.getConfig());
        int alpha, red, green, blue;
        int pixelColor;
        int height = original.getHeight();
        int width = original.getWidth();

        for (int y = 0; y < height; y++){
            for (int x= 0; x < width; x++){

                pixelColor = original.getPixel(x, y);

                alpha = Color.alpha(pixelColor);
                red = 255- Color.red(pixelColor);
                green = 255- Color.green(pixelColor);
                blue = 255- Color.blue(pixelColor);

                finalImage.setPixel(x, y, Color.argb(alpha,red,green, blue));

            }
        }

        return finalImage;

    }



}

ফটোশপের মত অ্যাপ গুলো এমন সিম্পল সিম্পল কোড দিয়েই তৈরি। তো ঐখানে অনেক গুলো সিম্পল কোড এক সাথ করে বিশাল একটা সফটওয়ার তৈরি করা হয়েছে। ব্যাসিক কিন্তু এ ছোট্ট অ্যাপেই রয়েছে। ব্যাসিক তিনটা কাজ করা হয়। একটা হচ্ছে ইমেজ সিলেক্ট করা, একটা হচ্ছে ইমেজে কিছু কাজ করা এবং শেষে ইমেজটি সেভ করতে পারা। খেয়াল করলে দেখব আমরা তিনটাই এ অ্যাপে করেছি। এখন যদি কেউ চায় বড় সড় কিছু করতে, সে পারবে। শুধু কি ধরনের কাজ করতে চায়, তা নিয়ে একটু পড়ালেখা করতে হবে। শুভ কামনা। সবার জন্য 🙂

Leave a Reply