Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Photo Filter Library with source code 2

How to add apply Instagram filters to image. Android Studio

1) Add Libraries to build.gradle.
 implementation 'com.android.support:design:27.1.1'

// image filtersimplementation
'info.androidhive:imagefilters:1.0.7'
// butter knifeimplementation
'com.jakewharton:butterknife:8.8.1
'annotationProcessor 
'com.jakewharton:butterknife-compiler:8.8.1'
// dexter M permissionsimplementation
'com.karumi:dexter:4.1.0'
implementation
'com.android.support:recyclerview-v7:26.1.0'

2) Add Read-write permission in manifests.


uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3) Create Main Activity layout.

xml version="1.0" encoding="utf-8"?>
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
xmlns:app="http://schemas.android.com/apk/res-auto"    
xmlns:tools="http://schemas.android.com/tools"    
android:layout_width="match_parent"    
android:id="@+id/ll"    
android:orientation="vertical"    
android:layout_height="match_parent"    
tools:context=".MainActivity">
ImageView       
android:id="@+id/image_preview"        
android:layout_width="match_parent"        
android:layout_height="360dp"        
android:scaleType="centerCrop" />
android.support.v7.widget.RecyclerView        
android:layout_width="match_parent"        
android:id="@+id/recycler_view"        
android:layout_marginTop="50dp"        
android:layout_height="wrap_content">
android.support.v7.widget.RecyclerView>
LinearLayout        
android:layout_width="match_parent"        
android:gravity="center"        
android:layout_marginTop="15dp"        
android:layout_height="wrap_content">
TextView            
android:layout_width="wrap_content"            
android:text="Gallery"            
android:textSize="15dp"            
android:textColor="#ffffff"            
android:background="@color/colorPrimary"            
android:padding="10dp"            
android:id="@+id/gallery"            
android:layout_margin="5dp"            
android:layout_height="wrap_content" />
TextView            
android:layout_width="wrap_content"            
android:textColor="#ffffff"          
android:layout_margin="5dp"           
android:background="@color/colorPrimary"            
android:id="@+id/save"            
android:text="Save"            
android:padding="10dp"            
android:layout_height="wrap_content" />
LinearLayout>
LinearLayout>
4) Write Main Activity code.

package com.example.filters;
import android.Manifest;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
import com.zomato.photofilters.FilterPack;
import com.zomato.photofilters.imageprocessors.Filter;
import com.zomato.photofilters.utils.ThumbnailItem;
import com.zomato.photofilters.utils.ThumbnailsManager;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements
             ViewEventAdapter.ThumbnailsAdapterListener {
ImageView imageView;
RecyclerView recyclerView;
public static final String IMAGE_NAME = "dog.jpg";
Bitmap originalImage;
// to backup image with filter applied Bitmap filteredImage;
Bitmap finalImage;

LinearLayout ll;
TextView gallery,save;
public static final int SELECT_GALLERY_IMAGE = 101;

ViewEventAdapter mAdapter;
ListthumbnailItemList;
LinearLayoutManager mLinearLayoutManager;
// load native image filters library static {
System.loadLibrary("NativeImageProcessor");
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override protected Void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll=findViewById(R.id.ll);
imageView = findViewById(R.id.image_preview);
recyclerView = findViewById(R.id.recycler_view);
loadImage();
thumbnailItemList = new ArrayList();
mAdapter = new ViewEventAdapter(thumbnailItemList, this, this);

recyclerView.setHasFixedSize(true);
mLinearLayoutManager = new LinearLayoutManager(this);
mLinearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(mLinearLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());


findViewById(R.id.gallery).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Dexter.withActivity(MainActivity.this).withPermissions
(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted()) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, SELECT_GALLERY_IMAGE);
} else {
Toast.makeText(getApplicationContext(),
"Permissions are not granted!",
Toast.LENGTH_SHORT).show();
}
}

@Override public void onPermissionRationaleShouldBeShown(List permissions,
PermissionToken token) {
token.continuePermissionRequest();
}
}).check();

}
});

findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {

saveImageToGallery();

}
});




// recyclerView.setAdapter(mAdapter);
// } pepare(null);
}


@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == SELECT_GALLERY_IMAGE) {
Bitmap bitmap = BitmapUtils.getBitmapFromGallery(this,
data.getData(), 800, 800);

// clear bitmap memory originalImage.recycle();
finalImage.recycle();
finalImage.recycle();

originalImage = bitmap.copy(Bitmap.Config.ARGB_8888, true);
filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
finalImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
Uri imageUri=data.getData();
imageView.setImageURI(imageUri);
// bitmap.recycle();

}
}
public void pepare(final Bitmap bitmap) {


Bitmap thumbImage;
ThumbnailsManager.clearThumbs();
thumbnailItemList.clear();

// add normal bitmap first thumbImage = (Bitmap)
BitmapUtils.getBitmapFromAssets(MainActivity.this, 
MainActivity.IMAGE_NAME, 100, 100);
ThumbnailItem thumbnailItem = new ThumbnailItem();
thumbnailItem.image = thumbImage;
thumbnailItem.filterName = getString(R.string.filter_normal);
ThumbnailsManager.addThumb(thumbnailItem);

List filters = FilterPack.getFilterPack(MainActivity.this);

for (Filter filter : filters) {
ThumbnailItem tI = new ThumbnailItem();
tI.image = thumbImage;
tI.filter = filter;
tI.filterName = filter.getName();
ThumbnailsManager.addThumb(tI);
}
thumbnailItemList.addAll(ThumbnailsManager.processThumbs(MainActivity.this));
mAdapter.notifyDataSetChanged();
}
// load the default image from assets on app launch private void loadImage() {
originalImage = BitmapUtils.getBitmapFromAssets(this, IMAGE_NAME, 300, 300);
filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
finalImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
imageView.setImageBitmap(originalImage);

}


@Override public void onFilterSelected(Filter filter) {
// applying the selected filter filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
// preview filtered image imageView.setImageBitmap(filter.processFilter(filteredImage));

finalImage = filteredImage.copy(Bitmap.Config.ARGB_8888, true);
}
private void saveImageToGallery() {
Dexter.withActivity(this).withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted()) {
final String path = BitmapUtils.insertImage(getContentResolver(), finalImage,
System.currentTimeMillis() + "_profile.jpg", null);
if (!TextUtils.isEmpty(path)) {
Snackbar snackbar = Snackbar
.make(ll, "Image saved to gallery!", Snackbar.LENGTH_LONG)
.setAction("OPEN", new View.OnClickListener() {
@Override
public void onClick(View view) {
openImage(path);
}
});

snackbar.show();
} else {
Snackbar snackbar = Snackbar
.make(ll, "Unable to save image!", Snackbar.LENGTH_LONG);

snackbar.show();
}
} else {
Toast.makeText(getApplicationContext(), "Permissions are not granted!",
Toast.LENGTH_SHORT).show();
}
}

@Override
public void onPermissionRationaleShouldBeShown(List permissions, 
PermissionToken token) {
token.continuePermissionRequest();
}
}).check();

}

// opening image in default image viewer app private void openImage(String path) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(path), "image/*");
startActivity(intent);
}
}
6) Create Layout for recyclerview.


xml version="1.0" encoding="utf-8"?>
LinearLayout    
android:orientation="vertical"    
android:layout_marginTop="10dp"    
android:layout_marginLeft="20dp"    
android:layout_marginRight="20dp"    
xmlns:android="http://schemas.android.com/apk/res/android"    
android:layout_width="wrap_content"    
android:layout_height="wrap_content">
TextView        
android:id="@+id/filter_name"        
android:layout_marginLeft="15dp"        
android:layout_width="wrap_content"        
android:textSize="15dp"        
android:layout_height="wrap_content"        
android:fontFamily="sans-serif-medium" />
ImageView        
android:layout_width="50dp"        
android:layout_marginLeft="15dp"        
android:id="@+id/img"        
android:textSize="25dp"        
android:layout_height="50dp" />
LinearLayout>
7) Create Adapter ( ViewEventAdapter ) for recyclerview.

package com.example.filters;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


import com.zomato.photofilters.imageprocessors.Filter;
import com.zomato.photofilters.utils.ThumbnailItem;

import java.util.HashMap;
import java.util.List;

public class ViewEventAdapter extends RecyclerView.Adapter {
private Listitem;
ViewEventAdapter.ThumbnailsAdapterListener listener;
Context context;

public ViewEventAdapter(List item, Context context,
ViewEventAdapter.ThumbnailsAdapterListener listener) {
this.item = item;
this.context = context;
this.listener=listener;
}

@NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup
viewGroup, int i) {
View view=LayoutInflater.from(viewGroup.getContext()).
inflate(R.layout.thumbnail_list_item,null);
return new ViewHolder(view);

}

@Override public void onBindViewHolder(@NonNull final ViewHolder viewHolder,
final int i) {
final ThumbnailItem item1=item.get(i);
viewHolder.title.setText(item1.filterName);
viewHolder.img.setImageBitmap(item1.image);
viewHolder.img.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {

listener.onFilterSelected(item1.filter);
// selectedIndex = position; notifyDataSetChanged();
}
});
}
public interface ThumbnailsAdapterListener {
void onFilterSelected(Filter filter);
}

@Override public int getItemCount() {
return item.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
private TextView title;
ImageView img;
public ViewHolder(@NonNull View itemView) {
super(itemView);
img=(ImageView) itemView.findViewById(R.id.img);
title=(TextView)itemView.findViewById(R.id.filter_name);


}
}
}
8) Create java class ( BitmapUtils )
package com.example.filters;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.provider.MediaStore;


This post first appeared on AR Programming, please read the originial post: here

Share the post

Photo Filter Library with source code 2

×

Subscribe to Ar Programming

Get updates delivered right to your inbox!

Thank you for your subscription

×