Android - Efekty obrazu

Android pozwala na manipulowanie obrazami poprzez dodawanie do nich różnego rodzaju efektów. Możesz łatwo zastosować techniki przetwarzania obrazu, aby dodać określone efekty do obrazów. Efektami mogą być jasność, ciemność, konwersja w skali szarości itp

Android udostępnia klasę Bitmap do obsługi obrazów. Można go znaleźć pod adresem android.graphics.bitmap. Istnieje wiele sposobów tworzenia instancji mapy bitowej. Tworzymy bitmapę obrazu z imageView.

private Bitmap bmp;
private ImageView img;
img = (ImageView)findViewById(R.id.imageView1);
BitmapDrawable  abmp = (BitmapDrawable)img.getDrawable();

Teraz utworzymy bitmapę, wywołując funkcję getBitmap () klasy BitmapDrawable. Jego składnia jest podana poniżej -

bmp = abmp.getBitmap();

Obraz to nic innego jak dwuwymiarowa matryca. W ten sam sposób będziesz obsługiwać mapę bitową. Obraz składa się z pikseli. Więc otrzymasz piksele z tej mapy bitowej i zastosujesz do niej przetwarzanie. Jego składnia jest następująca -

for(int i=0; i<bmp.getWidth(); i++){
   for(int j=0; j<bmp.getHeight(); j++){
      int p = bmp.getPixel(i, j);
   }
}

Funkcje getWidth () i getHeight () zwracają wysokość i szerokość macierzy. Metoda getPixel () zwraca piksel o określonym indeksie. Po uzyskaniu piksela możesz łatwo manipulować nim zgodnie ze swoimi potrzebami.

Oprócz tych metod istnieją inne metody, które pomagają nam lepiej manipulować obrazami.

Sr.No Metoda i opis
1

copy(Bitmap.Config config, boolean isMutable)

Ta metoda kopiuje piksele tej mapy bitowej do nowej mapy bitowej

2

createBitmap(DisplayMetrics display, int width, int height, Bitmap.Config config)

Zwraca zmienną bitmapę o określonej szerokości i wysokości

3

createBitmap(int width, int height, Bitmap.Config config)

Zwraca zmienną bitmapę o określonej szerokości i wysokości

4

createBitmap(Bitmap src)

Zwraca niezmienną bitmapę ze źródłowej mapy bitowej

5

extractAlpha()

Zwraca nową bitmapę, która przechwytuje wartości alfa oryginału

6

getConfig()

Ten mehtod zmienia tę konfigurację, w przeciwnym razie zwraca null

7

getDensity()

Zwraca gęstość dla tej mapy bitowej

8

getRowBytes()

Zwraca liczbę bajtów między wierszami w pikselach mapy bitowej

9

setPixel(int x, int y, int color)

Zapisz określony kolor do mapy bitowej (zakładając, że jest zmienny) we współrzędnej x, y

10

setDensity(int density)

Ta metoda określa gęstość tej mapy bitowej

Przykład

Poniższy przykład ilustruje niektóre efekty obrazu na mapie bitowej. Tworzy podstawową aplikację, która pozwala konwertować obraz na skalę szarości i wiele więcej.

Aby poeksperymentować z tym przykładem, musisz go uruchomić na rzeczywistym urządzeniu.

Kroki Opis
1 Użyjesz Android Studio do stworzenia aplikacji na Androida w pakiecie com.example.sairamkrishna.myapplication.
2 Zmodyfikuj plik src / MainActivity.java, aby dodać niezbędny kod.
3 Zmodyfikuj res / layout / activity_main, aby dodać odpowiednie komponenty XML
4 Uruchom aplikację i wybierz działające urządzenie z systemem Android, zainstaluj na nim aplikację i sprawdź wyniki

Poniżej znajduje się treść zmodyfikowanego pliku MainActivity.java.

package com.example.sairamkrishna.myapplication;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends ActionBarActivity {
   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; <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);
   }
}

Poniżej znajduje się zmodyfikowana zawartość pliku xml res/layout/activity_main.xml.

Tutaj abc wskazuje na logo tutorialspoint.com
<?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: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">
   
   <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="30dp"
      android:text="Image Effects" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials Point"
      android:id="@+id/textView2"
      android:layout_below="@+id/textView"
      android:layout_centerHorizontal="true"
      android:textSize="35dp"
      android:textColor="#ff16ff01" />
      
   <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:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Gray"
      android:onClick="gray"
      android:id="@+id/button"
      android:layout_alignParentBottom="true"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true"
      android:layout_marginBottom="97dp" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="dark"
      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="Bright"
      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="Red"
      android:onClick="gama"
      android:id="@+id/button4"
      android:layout_below="@+id/button3"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Green"
      android:onClick="green"
      android:id="@+id/button5"
      android:layout_alignTop="@+id/button4"
      android:layout_alignLeft="@+id/button3"
      android:layout_alignStart="@+id/button3" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="blue"
      android:onClick="blue"
      android:id="@+id/button6"
      android:layout_below="@+id/button2"
      android:layout_toRightOf="@+id/textView"
      android:layout_toEndOf="@+id/textView" />
      
</RelativeLayout>

Poniżej znajduje się treść AndroidManifest.xml plik.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.sairamkrishna.myapplication" >
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
   
      <activity
         android:name=".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>
      
   </application>
</manifest>

Spróbujmy uruchomić naszą aplikację, którą właśnie zmodyfikowaliśmy. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację ze studia Android, otwórz jeden z plików aktywności projektu i kliknij

ikonę Uruchom na pasku narzędzi. Studio Android instaluje aplikację na Twoim AVD i uruchamia ją, a jeśli wszystko jest w porządku z konfiguracją i aplikacją, wyświetli się następujące okno emulatora -

Teraz, jeśli spojrzysz na ekran swojego urządzenia, zobaczysz obraz Androida wraz z trzema przyciskami.

Teraz wystarczy wybrać szary przycisk, który przekonwertuje obraz na skalę szarości i zaktualizuje interfejs użytkownika. Jest to pokazane poniżej -

Teraz dotknij jasnego przycisku, który doda wartość do każdego piksela obrazu, tworząc w ten sposób iluzję jasności. Jest to pokazane poniżej -

Teraz dotknij ciemnego przycisku, który odejmie jakąś wartość od każdego piksela obrazu, tworząc w ten sposób iluzję ciemności. Jest to pokazane poniżej -

Teraz dotknij czerwonego przycisku, który odejmie jakąś wartość do każdego piksela obrazu, tworząc w ten sposób iluzję ciemności. Jest to pokazane poniżej -

Teraz dotknij zielonego przycisku, który odejmie jakąś wartość do każdego piksela obrazu, tworząc w ten sposób iluzję ciemności. Jest to pokazane poniżej -

Teraz dotknij niebieskiego przycisku, który odejmie jakąś wartość od każdego piksela obrazu, tworząc w ten sposób iluzję ciemności. Jest to pokazane poniżej -