مقدمه

اگر با برنامه ادیت عکس برای اندروید کار کرده باشید، حتما افکت‌های متختلفی مانند افکت‌های تغییر رنگ را دیده‌اید. گرافیک عکس برای اندروید بسیار پرطرفدار است چون این جلوه‌ها عکس‌ها را زیباتر می‌کنند و آن‌ها را برای انتشار در شبکه‌های اجتماعی مناسب‌تر می‌کنند. برای قرار دادن این افکت‌ها روی تصویر، باید مقدار آلفای عکس، ‌یعنی عمق و ترکیب رنگ‌های قرمز، آبی و سبز عکس، را تغییر دهید.

این پست به شما نشان می‌دهد که چطور این افکت تغییر رنگ را در اندروید استودیو بسازید. برای انتخاب عکس از گالری گوشی خود استفاده کرده و پنج افکت روی آن قرار خواهیم دارد. پس برای خواندن آموزش افکت دادن به تصاویر در اندروید و ساخت یک نرم افزار جلوه‌های ویژه عکس برای اندروید با ما همراه باشید.

مرحله‌ی 1

“activity_main” را باز کرده و کد زیر را به آن اضافه کنید.

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:paddingLeft="@dimen/activity_horizontal_margin"  
    android:paddingRight="@dimen/activity_horizontal_margin"  
    android:paddingTop="@dimen/activity_vertical_margin"  
    android:paddingBottom="@dimen/activity_vertical_margin"  
    tools:context=".MainActivity"  
    android:orientation="vertical">  
    <Button  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="Select a photo"  
        android:id="@+id/gallery"/>  
    <ImageView  
        android:layout_height="300dp"  
        android:layout_width="fill_parent"  
        android:id="@+id/original_image"  
        android:layout_marginTop="20dp"/>  
    <Button  
        android:text="Add Effects"  
        android:id="@+id/effects_btn"  
        android:layout_height="wrap_content"  
        android:layout_width="wrap_content"  
        android:paddingLeft="10dp"  
        android:paddingRight="10dp"  
        android:layout_marginTop="10dp"/>  
</LinearLayout> 

لی‌آوت ظاهری شبیه این دارد:

مرحله‌ی 2

برای نمایش لیستی از افکت‌هایی که می‌توانند روی یک عکس قرار گیرند، یک فایل لی‌آوت جدید بسازید.

در Layout گزینه‌ی “New” و سپس “Layout resource file” را انتخاب کنید. نام آن را “List_of_effects” گذاشته و کد زیر را به آن اضافه کنید.

 

<TextView xmlns:android="http://schemas.android.com/apk/res/android"  
          android:layout_width="fill_parent"  
          android:layout_height="fill_parent"  
          android:padding="10dp"  
          android:textSize="20sp"  
          android:background="#cd6959">  
</TextView>

مرحله‌ی 3

یک فایل لی‌آوت جدید برای نمایش عکسی که می‌خواهید افکت‌ها روی آن قرار بگیرند بسازید.

در Layout گزینه‌ی “New” و سپس “Layout resource file” را انتخاب کنید. نام آن را “file_view” گذاشته و کد زیر را به آن اضافه کنید:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
              android:orientation="vertical"  
              android:layout_width="match_parent"  
              android:layout_height="match_parent">  
    <ImageView  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:id="@+id/view"  
        android:layout_marginLeft="20dp"  
        android:layout_marginRight="20dp"  
        android:layout_marginTop="20dp"  
        android:layout_marginBottom="20dp"  
        />  
</LinearLayout>  

مرحله‌ی 4

“MainActivity” را باز کرده و کد زیر را به آن اضافه کنید:

 

package com.chhavi.imageeffectfinal;  
   
import android.content.Intent;  
import android.database.Cursor;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.net.Uri;  
import android.os.Bundle;  
import android.app.Activity;  
import android.provider.MediaStore;  
import android.util.Log;  
import android.view.Menu;  
import android.view.View;  
import android.widget.Button;  
import android.widget.ImageView;  
   
public class MainActivity extends Activity {  
   
    Button gallery;  
    Bitmap image;  
    ImageView original;  
    Button effects;  
    String picturePath;  
   
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
   
        original=(ImageView)findViewById(R.id.original_image);  
        effects=(Button)findViewById(R.id.effects_btn);  
   
        gallery=(Button)findViewById(R.id.gallery);  
        gallery.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
   
                Intent intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
                startActivityForResult(intent, 1);  
            }  
        });  
   
        effects.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
   
                Intent i=new Intent(MainActivity.this,ListOfEffects.class);  
                i.putExtra("image thumbnail path",picturePath);  
                startActivity(i);  
            }  
        });  
    }  
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        super.onActivityResult(requestCode, resultCode, data);  
   
        if(resultCode==RESULT_OK)  
        {  
            Uri selectedImage = data.getData();  
            String[] filePath = { MediaStore.Images.Media.DATA };  
            Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);  
            c.moveToFirst();  
            int columnIndex = c.getColumnIndex(filePath[0]);  
             picturePath = c.getString(columnIndex);  
            c.close();  
            image = (BitmapFactory.decodeFile(picturePath));  
            Log.i("path of image from gallery...............", picturePath + "");  
            original.setImageBitmap(image);  
        }  
    }  
   
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }     
}

در کد بالا، گالری یک گوشی اندروید را باز می‌کنیم. کاربران می‌توانند هر عکسی که دوست دارند را انتخاب کنند. با کلیک روی گزینه‌ی “Add Effects” یک فعالیت جدید لود شده و لیست افکت‌های موجود را نشان می‌دهد.

مرحله‌ی 5

در همان پکیج یک کلاس جدید بسازید. نام آن را “ListOfEffects” گذاشته و کد زیر را به آن اضافه کنید:

package com.chhavi.imageeffectfinal;  
   
import android.app.Activity;  
import android.app.ListActivity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.ArrayAdapter;  
import android.widget.ListView;  
import java.util.ArrayList;  
   
public class ListOfEffects extends ListActivity  
{  
    ArrayList<String> effects= new ArrayList<String>();  
    String path;  
    String effect_choosen;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
   
        Intent i=getIntent();  
        path=i.getStringExtra("image thumbnail path");  
        Log.i("path of file in list of effects......", path);  
   
        effects.add("Effect 1");  
        effects.add("Effect 2");  
        effects.add("Effect 3");  
        effects.add("Effect 4");  
        effects.add("Effect 5");  
   
        setListAdapter(new ArrayAdapter<String>(this, R.layout.list_of_effects,effects));  
   
        ListView listView = getListView();  
        listView.setTextFilterEnabled(true);  
   
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
            @Override  
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
                    //applyEffects(path);  
                effect_choosen=effects.get(position);  
                Log.i("Effect choosen................",effect_choosen);  
                applyEffects();  
            }  
        });  
    }  
    void applyEffects()  
    {  
        Intent i=new Intent(ListOfEffects.this, EffectAdded.class);  
        i.putExtra("path",path);  
        i.putExtra("effect",effect_choosen);  
        startActivity(i);  
    }  
}  

این کلاس لیست افکت‌هایی که می‌توانند به عکس اضافه شوند را نشان می‌دهد و یک فعالیت دیگر را روی کلیک آیتم لود می‌کند.

مرحله‌ی 6

یک کلاس دیگر بسازید. نام آن را “EffectsAdded” گذاشته و کد زیر را به آن اضافه کنید:

 

package com.chhavi.imageeffectfinal;  
   
import android.app.Activity;  
import android.content.Intent;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.BlurMaskFilter;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.PorterDuff;  
import android.os.Bundle;  
import android.util.Log;  
import android.widget.ImageView;  
   
public class EffectAdded extends Activity {  
    String path;  
    String effect_choosen;  
    ImageView changed;  
    Bitmap out;  
   
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.final_view);  
   
        Intent i=getIntent();  
        path=i.getStringExtra("path");  
        effect_choosen=i.getStringExtra("effect");  
   
        changed=(ImageView)findViewById(R.id.view);  
   
        Log.i("path of file in effects added.....................", path);  
        Log.i("effect chosen in effects added.....................", effect_choosen);  
   
        Bitmap thumbnail = (BitmapFactory.decodeFile(path));  
   
        if(effect_choosen.equalsIgnoreCase("Effect 1"))  
        {  
           out=addEffect(thumbnail,5,5.0,6.0,0.0);  //red,blue,no green  
        }  
        else if(effect_choosen.equalsIgnoreCase("Effect 2"))  
        {  
            out=addEffect(thumbnail,5,5.0,0.0,10.0);  //red,green,no blue  
        }  
        else if(effect_choosen.equalsIgnoreCase("Effect 3"))  
        {  
            out=addEffect(thumbnail,5,0.0,10.0,0.0);  //only green  
        }  
        else if(effect_choosen.equalsIgnoreCase("Effect 4"))  
        {  
            out=addEffect(thumbnail,15,5.0,0.0,10.0);  //red,green,no blue, depth increased  
        }  
        else if(effect_choosen.equalsIgnoreCase("Effect 5"))  
        {  
            out=addEffect(thumbnail,5,10.0,0.0,0.0);  //only red  
        }  
   
        changed.setImageBitmap(out);  
    }  
   
    public static Bitmap addEffect(Bitmap src, int depth, double red, double green, double blue) {  
       
        int width = src.getWidth();  
        int height = src.getHeight();  
       
        Bitmap finalBitmap = Bitmap.createBitmap(width, height, src.getConfig());  
       
        final double grayScale_Red = 0.3;  
        final double grayScale_Green = 0.59;  
        final double grayScale_Blue = 0.11;  
     
        int channel_aplha, channel_red, channel_green, channel_blue;  
        int pixel;  
        
        for(int x = 0; x < width; ++x) {  
            for(int y = 0; y < height; ++y) {  
                
                pixel = src.getPixel(x, y);                 
                channel_aplha = Color.alpha(pixel);  
                channel_red = Color.red(pixel);  
                channel_green = Color.green(pixel);  
                channel_blue = Color.blue(pixel);  
                
                channel_blue = channel_green = channel_red = (int)(grayScale_Red * channel_red + grayScale_Green * channel_green + grayScale_Blue * channel_blue);  
   
                channel_red += (depth * red);  
                if(channel_red > 255)  
                {  
                    channel_red = 255;  
                }  
                channel_green += (depth * green);  
                if(channel_green > 255)  
                {  
                    channel_green = 255;  
                }  
                channel_blue += (depth * blue);  
                if(channel_blue > 255)  
                {  
                    channel_blue = 255;  
                }  
                 
                finalBitmap.setPixel(x, y, Color.argb(channel_aplha, channel_red, channel_green, channel_blue));  
            }  
        }       
        return finalBitmap;  
    }  
}  

در کد بالا، فانکشن‌های “getWidth” و “getHeight” پهنا و ارتفاع بیت‌مپ فعلی را برمی‌گردانند. افکتی که می‌خواهیم برای edit روی عکس قرار دهیم باید روی همه‌ی پیکسل‌های آن اعمال شود. حلقه‌های

“for” درون کد برای اعمال افکت به همه‌ی پیکسل‌های عکس قرار داده شده‌اند.

کلاس Color روش‌هایی برای ایجاد و تغییر int‌های رنگ ارائه می‌دهد. رنگ‌ها به صورت مجموعه‌هایی از int‌ها که حاوی 4 بایت آلفا، قرمز، سبز و آبی هستند نشان داده شده‌اند. هر جزء در بازه‌ی 0 تا 255 است. 0‌ یعنی این جزء در رنگ وجود ندارد و 255‌ یعنی 100 درصد رنگ از این جزء تشکیل شده است. “alpha”، “red”، “blue” و “green” روش‌های کلاس Color هستند که جزء آلفا، جزء قرمز، جزء آبی و جزء سبز int رنگ را برمی‌گردانند.

روش “Color.argb” int رنگ اجزاء آلفا، قرمز، سبز و آبی را برمی‌گرداند.

در نهایت، بیت‌مپ تغییر یافته به عکس اضافه می‌شود.

مرحله‌ی 7

تغییرات زیر را به “AndroidManifest” اضافه کنید:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.chhavi.imageeffectfinal"  
    android:versionCode="1"  
    android:versionName="1.0" >  
   
    <uses-sdk  
        android:minSdkVersion="7"  
        android:targetSdkVersion="16" />  
   
    <application  
        android:allowBackup="true"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name"  
        android:theme="@style/AppTheme" >  
        <activity  
            android:name="com.chhavi.imageeffectfinal.MainActivity"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
   
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
       
        <activity android:name=".ListOfEffects"  
                  android:label="Choose Effect"/>  
   
        <activity android:name=".EffectAdded"  
                  android:label="Final Image"/>  
    </application>  
   
</manifest>  

نرم افزار جلوه‌های ویژه عکس برای اندروید شما آماده است. می‌توانید اسکرین شات نتیجه را ببینید:

با کلیک روی “Select a Photo” می‌توانید گالری را باز کنید:

یک عکس از گالری برای edit انتخاب کنید:

روی گزینه‌ی “Add Effects” کلیک کنید:

افکت1:

افکت2:

افکت3:

افکت4:

افکت5:

نتیجه گیری

در این پست آموزش افکت دادن به تصاویر در اندروید و روش ساخت برنامه ادیت عکس برای اندروید را برای شما قرار دادیم و به شما یاد دادیم چطور پنج افکت مختلف را روی عکس‌های گالری گوشی اندروید خود قرار دهید. با تغییر دادن مقدار آلفا، عمق و رنگ‌های قرمز، سبز و آبی می‌توانید افکت‌ها و جلوهای جدیدی برای عکس‌های خود بسازید. امیدواریم از این آموزش ساخت نرم افزار گرافیک عکس برای اندروید لذت برده باشید.