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

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

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

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

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

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

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

ناصر خالدی

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

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

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

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

اندروید

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


۱۰۳۵
۰
۲۹ آبان ۱۳۹۹

وردپرس

وردپرس یک سیستم مدیریت محتوای قوی می باشد که با استفاده از آن می توان وب سایت ها و وبلاگ های گوناگونی با هر شرایطی را طراحی کرد چرا که این سیستم و ...


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

پی اچ پی - PHP

با استفاده از این زبان می توان وب سایت های پویا طراحی کرد, این زبان می تواند با HTML ادغام شود, در حقیقت یک زبان اسکریپتی متن باز و رایگان است. یعنی زمانی که سرور درخواست ...


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

نود جی اس

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


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