افکت گذاری با bitmap بر روی تصاویر - در برنامه نویسی اندروید

اندروید به شما اجازه می دهد تا با افزودن انواع افکت گذاری ها بر روی تصاویر با استفاده از 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 بر روی تصویر مد نظر اعمال کنید. در این آموزش ما به مباحث اولیه اعمال این تغییرات پرداخته ایم. شما میتوانید با زوم کردن بر روی کد ها به راحتی میزان درصد اعمال هر کدام را بالا و پایین کنید.

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر نیاز است تا ابتدا وارد سایت شوید.

هیچ نظری ارسال نشده است.

قیمت آموزش
رایگان
نوع دسترسی
رایگان

این مقاله در حال حاضر تنها به روش رایگان در دسترس می باشد.

ناصر خالدی
مدرس دوره

ناصر خالدی

مهندس شبکه, امنیت, برنامه نویسی تلفن های هوشمند, طراح وب سایت و متخصص هوش مصنوعی

گفتگوی برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن

دوره های پیشنهادی

مقالات پیشنهادی

جاوا اسکریپت

جاوا اسکریپت یک زبان پویا و محبوب مبتنی بر شیء, داینامیک و مفسری می باشد. این زبان برای برنامه نویسی سمت سرور و کلاینت استفاده میشود که ...


۸۷۰
۰
۱۳ آذر ۱۳۹۹

درباره فایل Robots.txt

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


۷۵۶
۰
۲ دی ۱۳۹۹

بک لینک چیست؟

بک لینک (Back Link) به لینک دادن یک سایت به سایت دیگر گفته میشود که یک فاکتور مهم و اساسی در سئو هر سایتی می باشد.


۹۹۴
۰
۲۲ آذر ۱۳۹۹

نود جی اس

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


۹۱۷
۰
۱۲ آذر ۱۳۹۹