This blog is about how to create water reflection image.
1. Create android Project.
2. Activity layout file is look like :-
<?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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.ammy.waterreflection.MainActivity">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
3. Write Image.java class.
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import java.nio.IntBuffer;
/**
*
*/
public class Image {
//original bitmap image
public Bitmap image;
public Bitmap destImage;
//format of image (jpg/png)
private String formatName;
//dimensions of image
private int width, height;
// RGB Array Color
protected int[] colorArray;
public Image(Bitmap img){
this.image = img;
formatName = "jpg";
width = img.getWidth();
height = img.getHeight();
destImage = Bitmap.createBitmap(width, height, Config.ARGB_8888);
updateColorArray();
}
public Image clone(){
return new Image(this.image);
}
/**
* Set color array for image - called on initialisation
* by constructor
* @param
*/
private void updateColorArray(){
colorArray = new int[width * height];
image.getPixels(colorArray, 0, width, 0, 0, width, height);
int r, g, b;
for (int y = 0; y < height; y++){
for (int x = 0; x < width; x++){
int index = y * width + x;
r = (colorArray[index] >> 16) & 0xff;
g = (colorArray[index] >> 8) & 0xff;
b = colorArray[index] & 0xff;
colorArray[index] = 0xff000000 | (b << 16) | (g << 8) | r;
}
}
}
/**
* Set the color of a specified pixel from an RGB combo
*/
public void setPixelColor(int x, int y, int c0, int c1, int c2){
int rgbcolor = (255 << 24) + (c0 << 16) + (c1 << 8) + c2;
colorArray[((y*image.getWidth()+x))] = rgbcolor;
}
public void copyPixelsFromBuffer() {
IntBuffer vbb = IntBuffer.wrap(colorArray);
destImage.copyPixelsFromBuffer(vbb);
vbb.clear();
}
/**
* Method to get the RED color for the specified
* pixel
* @return color of R
*/
public int getRComponent(int x, int y){
return (getColorArray()[((y*width+x))]& 0x00FF0000) >>> 16;
}
/**
* Method to get the GREEN color for the specified
* pixel
* @return color of G
*/
public int getGComponent(int x, int y){
return (getColorArray()[((y*width+x))]& 0x0000FF00) >>> 8;
}
/**
* Method to get the BLUE color for the specified
* pixel
* @return color of B
*/
public int getBComponent(int x, int y){
return (getColorArray()[((y*width+x))] & 0x000000FF);
}
/**
* @return the image
*/
public Bitmap getImage() {
return destImage;
}
/**
* @return the width
*/
public int getWidth() {
return width;
}
/**
* @return the height
*/
public int getHeight() {
return height;
}
/**
* @return the colorArray
*/
public int[] getColorArray() {
return colorArray;
}
}
4. Create new class WaterReflection.java and copy below code:-
public class WaterReflection {
int _amount ;
/**
amount >= 2.
*/
public WaterReflection(int amount)
{
_amount = ((amount >= 2) ? amount : 2) ;
}
public Image process(Image imageIn) {
int r, g, b, m_current = 0;
int width = imageIn.getWidth();
int height = imageIn.getHeight();
Image clone = imageIn.clone();
for(int y = 0 ; y < height ; y++){
for(int x = 0 ; x < width ; x++){
if (x == 0) {
m_current = (getRandomInt(-255, 0xff) % _amount) * ((getRandomInt(-255, 0xff) % 2 > 0) ? 1 : -1) ;
}
int sx = FClamp(x+m_current, 0, width-1);
r = clone.getRComponent(sx, y);
g = clone.getGComponent(sx, y);
b = clone.getBComponent(sx, y);
imageIn.setPixelColor(x, y, r, g, b);
}
}
return imageIn;
}
public int getRandomInt(int a, int b) {
int min = Math.min(a, b);
int max = Math.max(a, b);
return min + (int)(Math.random() * (max - min + 1));
}
public static int FClamp(final int t, final int tLow, final int tHigh)
{
if (t < tHigh)
{
return ((t > tLow) ? t : tLow) ;
}
return tHigh ;
}
}
5. On your Activity write field variables.
Bitmap bit;
private Bitmap blurBitmap;
private ImageView image;
6. write below code on your OnCreate().
bit = BitmapFactory.decodeResource(getResources(), R.drawable.abc);
image = (ImageView) findViewById(R.id.image);
processImageTask processImage = new processImageTask(new WaterReflection(30));
processImage.execute();
*Note:- I use image from drawable get bitmap object. you can use gallery/Camera intent and process bitmap.
Result:-
Happy Coding :D
0 Comment(s)