اندروید به شما اجازه می دهد تا با افزودن انواع افکت گذاری ها بر روی تصاویر با استفاده از bitmap، تصاویر خود را دستکاری کنید. شما به راحتی می توانید تکنیک های پردازش تصویر را برای افزودن انواع خاصی از جلوه ها بر روی تصاویر اعمال کنید. تغییرات و ایجاد اثرات می تواند شامل روشنایی، تاریکی، تبدیل مقیاس خاکستری و غیره باشد.
نمونه گیری از Bitmap در اندروید
اندروید کلاس Bitmap را برای مدیریت تصاویر ارائه داده است. این کلاس را می توانید در پکیج android.graphics.bitmap یافت کنید. راه های زیادی وجود دارد که از طریق آنها می توانید bitmap را نمونه برداری کنید. در این آموزش ما نمونه گیری از bitmap را با استفاده از تصویر موجود در imageView انجام میدهیم. به کد های زیر دقت کنید :
private Bitmap bmp; private ImageView img; img = (ImageView)findViewById(R.id.imageView1); BitmapDrawable abmp = (BitmapDrawable)img.getDrawable();
حالا با فراخوانی تابع getBitmap() از کلاس BitmapDrawable، یک bitmap ایجاد می کنیم. به کد های زیر دقت داشته باشید:
bmp = abmp.getBitmap();
یک تصویر چیزی نیست جز یک ماتریس دو بعدی. یک تصویر از پیکسل تشکیل شده است. بنابراین شما از این bitmap پیکسل دریافت می کنید و پردازش هایی را بر روی آن اعمال می کنید. به کد های زیر دقت کنید :
for(int i=0; i<bmp.getWidth(); i++){ for(int j=0; j<bmp.getHeight(); j++){ int p = bmp.getPixel(i, j); } }
توابع getWidth() و getHeight() ارتفاع و عرض ماتریس را برمی گرداند. متد getPixel() پیکسل را در ایندکس مشخص شده برمی گرداند. هنگامی که پیکسل را به دست آوردید، می توانید به راحتی آن را مطابق با نیاز خود دستکاری کنید تا آن چیزی که مد نظرتان است به وجود آید.
دیگر توابع bitmap برای مدیریت افکت گذاری ها
متد و توضیحات | ردیف |
copy(Bitmap.Config config, boolean isMutable)
این متد پیکسل های این bitmap را در یک bitmap جدید کپی می کند. |
1 |
createBitmap(DisplayMetrics display, int width, int height, Bitmap.Config config)
یک بیت مپ قابل تغییر را با عرض و ارتفاع مشخص شده برمی گرداند. |
2 |
createBitmap(int width, int height, Bitmap.Config config)
یک بیت مپ قابل تغییر را با عرض و ارتفاع مشخص شده برمی گرداند. |
3 |
createBitmap(Bitmap src)
یک بیت مپ تغییر ناپذیر را از بیت مپ منبع برمی گرداند. |
4 |
extractAlpha()
یک bitmap جدید را برمی گرداند که مقادیر آلفای اصلی را دریافت می کند. |
5 |
getConfig()
این متد پیکربندی را برمیگرداند، در غیر این صورت null را برمیگرداند. |
6 |
getDensity()
چگالی bitmap را برمی گرداند. |
7 |
getRowBytes()
تعداد بایت های بین ردیف های پیکسل های bitmap را بر می گرداند. |
8 |
setPixel(int x, int y, int color)
رنگ مشخص شده را در bitmap (با فرض اینکه قابل تغییر است) در مختصات x,y اعمال میکند. |
9 |
setDensity(int density)
این متد چگالی را برای این bitmap مشخص می کند. |
10 |
مثال
در مثال پایین که آماده کرده ایم, برخی از افکت هایی که میتوان بر روی یک تصویر با استفاده از bitmap اعمال شود را آموزش داده ایم. با استفاده از این آموزش میتوانید تصویر را به مقیاس خاکستری و موارد دیگر تبدیل کنید. برای آزمایش با این مثال، باید آن را روی یک دستگاه واقعی اجرا کنید.
توضیحات | مرحله |
ابتدا یک پروژه جدید در اندروید استودیو با یک پکیج دلخواه ایجاد کنید. | 1 |
کدهای درون فایل MainActivity.class را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 2 |
کدهای درون فایل activity_main.xml را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 3 |
برنامه را بر روی یک تلفن واقعی یا شبیه ساز اجرا کنید و تست را انجام بدهید. | 4 |
کدهای فایل MainActivity.class
package com.foray.articlelib; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { Button b1, b2, b3; ImageView im; private Bitmap bmp; private Bitmap operation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.button); b2 = (Button) findViewById(R.id.button2); b3 = (Button) findViewById(R.id.button3); im = (ImageView) findViewById(R.id.imageView); BitmapDrawable abmp = (BitmapDrawable) im.getDrawable(); bmp = abmp.getBitmap(); } public void gray(View view) { operation = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); double red = 0.33; double green = 0.59; double blue = 0.11; for (int i = 0; i < bmp.getWidth(); i++) { for (int j = 0; j < bmp.getHeight(); j++) { int p = bmp.getPixel(i, j); int r = Color.red(p); int g = Color.green(p); int b = Color.blue(p); r = (int) red * r; g = (int) green * g; b = (int) blue * b; operation.setPixel(i, j, Color.argb(Color.alpha(p), r, g, b)); } } im.setImageBitmap(operation); } public void bright(View view) { operation = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); for (int i = 0; i < bmp.getWidth(); i++) { for (int j = 0; j < bmp.getHeight(); j++) { int p = bmp.getPixel(i, j); int r = Color.red(p); int g = Color.green(p); int b = Color.blue(p); int alpha = Color.alpha(p); r = 100 + r; g = 100 + g; b = 100 + b; alpha = 100 + alpha; operation.setPixel(i, j, Color.argb(alpha, r, g, b)); } } im.setImageBitmap(operation); } public void dark(View view) { operation = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); for (int i = 0; i < bmp.getWidth(); i++) { for (int j = 0; j < bmp.getHeight(); j++) { int p = bmp.getPixel(i, j); int r = Color.red(p); int g = Color.green(p); int b = Color.blue(p); int alpha = Color.alpha(p); r = r - 50; g = g - 50; b = b - 50; alpha = alpha - 50; operation.setPixel(i, j, Color.argb(Color.alpha(p), r, g, b)); } } im.setImageBitmap(operation); } public void gama(View view) { operation = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); for (int i = 0; i < bmp.getWidth(); i++) { for (int j = 0; j < bmp.getHeight(); j++) { int p = bmp.getPixel(i, j); int r = Color.red(p); int g = Color.green(p); int b = Color.blue(p); int alpha = Color.alpha(p); r = r + 150; g = 0; b = 0; alpha = 0; operation.setPixel(i, j, Color.argb(Color.alpha(p), r, g, b)); } } im.setImageBitmap(operation); } public void green(View view) { operation = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); for (int i = 0; i < bmp.getWidth(); i++) { for (int j = 0; j < bmp.getHeight(); j++) { int p = bmp.getPixel(i, j); int r = Color.red(p); int g = Color.green(p); int b = Color.blue(p); int alpha = Color.alpha(p); r = 0; g = g + 150; b = 0; alpha = 0; operation.setPixel(i, j, Color.argb(Color.alpha(p), r, g, b)); } } im.setImageBitmap(operation); } public void blue(View view) { operation = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); for (int i = 0; i < bmp.getWidth(); i++) { for (int j = 0; j < bmp.getHeight(); j++) { int p = bmp.getPixel(i, j); int r = Color.red(p); int g = Color.green(p); int b = Color.blue(p); int alpha = Color.alpha(p); r = 0; g = 0; b = b + 150; alpha = 0; operation.setPixel(i, j, Color.argb(Color.alpha(p), r, g, b)); } } im.setImageBitmap(operation); } }
کدهای فایل activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:padding="16dp" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="25dp" android:text="افکت گذاری بر روی تصاویر" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="7Cloner.com" android:id="@+id/textView2" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:textSize="25dp" android:textColor="#000000" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" android:src="@drawable/abc"/> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" android:layout_marginBottom="97dp" android:onClick="gray" android:text="خاکستری" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="سیاه" android:onClick="dark" android:id="@+id/button2" android:layout_alignBottom="@+id/button" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="روشن" android:onClick="bright" android:id="@+id/button3" android:layout_alignTop="@+id/button2" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="قرمز" android:onClick="gama" android:id="@+id/button4" android:layout_below="@+id/button3" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/button3" android:layout_alignEnd="@+id/button3" android:layout_alignTop="@+id/button4" android:onClick="green" android:text="سبز" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@id/button2" android:layout_alignEnd="@id/button2" android:layout_below="@id/button2" android:onClick="blue" android:text="آبی" /> </RelativeLayout>
نتیجه
همان طور که در تصاویر بالا می بینید بعد از اجرای پروژه به راحتی با کلیک بر روی هر دکمه ای میتوانید یکسری افکت گذاری ها با استفاده از bitmap بر روی تصویر مد نظر اعمال کنید. در این آموزش ما به مباحث اولیه اعمال این تغییرات پرداخته ایم. شما میتوانید با زوم کردن بر روی کد ها به راحتی میزان درصد اعمال هر کدام را بالا و پایین کنید.