Como construir filtros de imagem como o Instagram no Android?
Hoje em dia, muitos aplicativos de mídia social fornecem tantos filtros que podemos usar para tornar nossa imagem dentro do aplicativo mais bonita e atraente. Esse tipo de recurso é geralmente visto no Instagram, Snapchat e em muitos aplicativos de mídia social. Neste artigo, daremos uma olhada na implementação dessa seção de filtro semelhante ao Instagram no Android.
O que vamos construir neste artigo?
Estaremos construindo um aplicativo simples no qual exibiremos um ImageView e forneceremos diferentes tipos de opções de filtragem de imagem abaixo. Depois de clicar em cada filtro de imagem, esse filtro será aplicado à imagem original. Um exemplo de GIF é fornecido abaixo para se ter uma ideia sobre o que faremos neste artigo. Observe que vamos implementar este projeto usando a linguagem Java .
Implementação passo a passo
Etapa 1: Criar um novo projeto
Para criar um novo projeto no Android Studio, consulte Como criar / iniciar um novo projeto no Android Studio . Observe que selecione Java como a linguagem de programação.
Etapa 2: adicionar dependência e repositório JitPack
Navegue até Gradle Scripts> build.gradle (Módulo: app) e adicione a dependência abaixo na seção de dependências.
implementação 'com.github.mukeshsolanki: photofilter: 1.0.2'
Adicione o repositório JitPack ao seu arquivo de construção. Adicione-o ao build.gradle raiz no final dos repositórios dentro da seção allprojects {}.
allprojects {
repositórios {
…
maven {url “https://jitpack.io”}
}
}
Depois de adicionar esta dependência, sincronize seu projeto e agora iremos em direção à sua implementação.
Etapa 3: Trabalhando com o arquivo activity_main.xml
Navegue até app> res> layout> activity_main.xml e adicione o código abaixo a esse arquivo. Abaixo está o código para o arquivo 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:orientation="vertical"
tools:context=".MainActivity">
<!--Imageview for our original image-->
<ImageView
android:id="@+id/idIVOriginalImage"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_centerHorizontal="true"
android:layout_margin="20dp"
android:padding="5dp"
android:src="@drawable/image" />
<!--horizontal scroll view for displaying
all our image filters-->
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/idIVOriginalImage"
android:layout_marginTop="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!--We are creating a linear layout for displaying
each item in horizontal scroll view-->
<LinearLayout
android:id="@+id/idLLVignette"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<!--We are displaying the image view how it
will look after applying the filter-->
<ImageView
android:id="@+id/idIVOne"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<!--Text view for displaying our filter name-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 1"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLTint"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVTwo"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 2"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLTemperature"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVThree"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 3"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLSharpen"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVFour"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 4"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLSepia"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVFive"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 5"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLSaturate"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVSix"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 6"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLRotate"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVSeven"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 7"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLPosterize"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVEight"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 8"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLNone"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVNine"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 9"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/idLLNegative"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/idIVTen"
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_gravity="center"
android:src="@drawable/image" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="Filter 10"
android:textAlignment="center"
android:textColor="@color/black" />
</LinearLayout>
</LinearLayout>
</HorizontalScrollView>
</RelativeLayout>
Etapa 4: Trabalhando com o arquivo MainActivity.java
Vá para o arquivo MainActivity.java e consulte o código a seguir. Abaixo está o código para o arquivo MainActivity.java . Os comentários são adicionados dentro do código para entender o código em mais detalhes.
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import com.mukesh.image_processing.ImageProcessor;
public class MainActivity extends AppCompatActivity {
// creating a bitmap for our original
// image and all image filters.
Bitmap bitmap;
// creating a variable for image view.
ImageView oneIV, twoIV, threeIV, fourIV, fiveIV, sixIV, sevenIV, eightIV, nineIV, tenIV, originalIV;
Bitmap oneBitMap, twoBitMap, threeBitmap, fourBitMap, fiveBitMap, sixBitMap, sevenBitMap, eightBitMap, nineBitMap, tenBitMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// creating a variable for our image processor.
ImageProcessor processor = new ImageProcessor();
// initializing bitmap with our image resource.
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
// initializing image views for our filters
// and original image on which we will
// be applying our filters.
oneIV = findViewById(R.id.idIVOne);
twoIV = findViewById(R.id.idIVTwo);
threeIV = findViewById(R.id.idIVThree);
fourIV = findViewById(R.id.idIVFour);
fiveIV = findViewById(R.id.idIVFive);
sixIV = findViewById(R.id.idIVSix);
sevenIV = findViewById(R.id.idIVSeven);
eightIV = findViewById(R.id.idIVEight);
nineIV = findViewById(R.id.idIVNine);
tenIV = findViewById(R.id.idIVTen);
originalIV = findViewById(R.id.idIVOriginalImage);
// below line is use to add tint effect to our original
// image bitmap and storing that in one bitmap.
oneBitMap = processor.tintImage(bitmap, 90);
// after storing it to one bitmap
// we are setting it to imageview.
oneIV.setImageBitmap(oneBitMap);
// below line is use to apply gaussian blur effect
// to our original image bitmap.
twoBitMap = processor.applyGaussianBlur(bitmap);
twoIV.setImageBitmap(twoBitMap);
// below line is use to add sepia toing effect
// to our original image bitmap.
threeBitmap = processor.createSepiaToningEffect(bitmap, 1, 2, 1, 5);
threeIV.setImageBitmap(threeBitmap);
// below line is use to apply saturation
// filter to our original image bitmap.
fourBitMap = processor.applySaturationFilter(bitmap, 3);
fourIV.setImageBitmap(fourBitMap);
// below line is use to apply snow effect
// to our original image bitmap.
fiveBitMap = processor.applySnowEffect(bitmap);
fiveIV.setImageBitmap(fiveBitMap);
// below line is use to add gray scale
// to our image view.
sixBitMap = processor.doGreyScale(bitmap);
sixIV.setImageBitmap(sixBitMap);
// below line is use to add engrave effect
// to our image view.
sevenBitMap = processor.engrave(bitmap);
sevenIV.setImageBitmap(sevenBitMap);
// below line is use to create a contrast
// effect to our image view.
eightBitMap = processor.createContrast(bitmap, 1.5);
eightIV.setImageBitmap(eightBitMap);
// below line is use to add shadow effect
// to our original bitmap.
nineBitMap = processor.createShadow(bitmap);
nineIV.setImageBitmap(nineBitMap);
// below line is use to add flea
// effect to our image view.
tenBitMap = processor.applyFleaEffect(bitmap);
tenIV.setImageBitmap(tenBitMap);
// below line is use to call on click
// listener for our all image filters.
initializeOnCLickListerns();
}
private void initializeOnCLickListerns() {
oneIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// on clicking on each filter we are
// setting that filter to our original image.
originalIV.setImageBitmap(oneBitMap);
}
});
twoIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(twoBitMap);
}
});
threeIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(threeBitmap);
}
});
fourIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(fourBitMap);
}
});
fiveIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(fiveBitMap);
}
});
sixIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(sixBitMap);
}
});
sevenIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(sevenBitMap);
}
});
eightIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(eightBitMap);
}
});
nineIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(nineBitMap);
}
});
tenIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
originalIV.setImageBitmap(tenBitMap);
}
});
}
}
A imagem usada neste projeto é adicionada à pasta drawable. Para navegar na imagem, navegue até app> res> drawable e você encontrará a imagem nessa pasta. Agora execute o aplicativo e veja a saída do código abaixo:
Saída:
Nota: O aplicativo levará algum tempo para carregar, embora estejamos usando bitmap e leva tempo para decodificar a imagem para o bitmap.
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva