Monday 6 July 2015

Image Canvas Using Android Application with source code




                                                           Image Canvas



Step 1:-

ChooseActivity.java

package com.example.paintapp;

import java.io.ByteArrayOutputStream;
import java.io.File;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class ChooseActivity extends Activity {

private final String TAG = getClass().getSimpleName();

public static final String BITMAP = "bitmap";
public static final String IMAGE_PATH = "imagePath";
private Button fromGallery, captureFromCamera;
private ImageView capturedImage;
public static final int SUCCESS = 1;
public static final int FAILURE = 2;

private static final int TAKE_PICTURE = 0;
private static final int EDIT_PICTURE = 1;
private static final int SELECT_PICTURE = 2;
private Uri mUri;
private File photoFile;
public static Bitmap mPhoto;
String JPEG_FILE_PREFIX = "IMG";

String JPEG_FILE_SUFFIX = ".jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose);

// fromGallery = (Button) findViewById(R.id.chooseGallery);
captureFromCamera = (Button) findViewById(R.id.chooseCaptureFromCamera);

capturedImage = (ImageView) findViewById(R.id.capturedImage);

/*
* fromGallery.setOnClickListener(new OnClickListener() {
*
* @Override public void onClick(View v) { // TODO Auto-generated method
* stub Intent intent = new Intent(); intent.setType("image/*");
* intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(
* Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); }
* });
*/
captureFromCamera.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
photoFile = new File(Environment.getExternalStorageDirectory(),
"photo.jpg");
mUri = Uri.fromFile(photoFile);
Intent intent = new Intent(ChooseActivity.this,
CameraActivity.class);
intent.putExtra(IMAGE_PATH, photoFile.getAbsolutePath());
startActivityForResult(intent, TAKE_PICTURE);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TAKE_PICTURE && resultCode == SUCCESS) {
getContentResolver().notifyChange(mUri, null);
// ContentResolver cr = getContentResolver();
try {
// Log.v(TAG,"Orientation is : "+data.getIntExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,-1000));
new LoadCapturedImageTask().execute();
} catch (Exception e) {
}
} else if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
photoFile = new File(getPath(selectedImageUri));
mUri = Uri.fromFile(photoFile);
getContentResolver().notifyChange(mUri, null);
new LoadCapturedImageTask().execute();
} else if (requestCode == EDIT_PICTURE
&& resultCode == FingerPaint.SUCCESS) {
Log.v(TAG, "Here too");

mPhoto = (Bitmap) data.getParcelableExtra(BITMAP);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
mPhoto.compress(Bitmap.CompressFormat.PNG, 100, bos);
Drawable drawable = new BitmapDrawable(getResources(), mPhoto);
capturedImage.setBackgroundDrawable(drawable);
}
}

public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}

public static void displayAlert(Context context, String msg) {
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert.setMessage(context.getString(R.string.app_name));
alert.setMessage(msg);
alert.setPositiveButton(context.getString(R.string.btn_ok),
new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub

}
});
alert.show();
}

private Bitmap rotateImage(Bitmap bitmap, int angle, int width, int height) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);

return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
}

class LoadCapturedImageTask extends AsyncTask<Void, Void, Void> {

ProgressDialog progress;

@Override
protected void onPreExecute() {
progress = ProgressDialog.show(ChooseActivity.this, "",
getString(R.string.msg_please_wait));
}

@Override
protected Void doInBackground(Void... params) {
/*
* mPhoto = android.provider.MediaStore.Images.Media.getBitmap(cr,
* mUri);
*/
BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Log.v(TAG, "Path : " + photoFile.getAbsolutePath());
mPhoto = BitmapFactory.decodeFile(photoFile.getAbsolutePath(), o)
.copy(Bitmap.Config.ARGB_8888, true);
int height = mPhoto.getHeight();
int width = mPhoto.getWidth();
/*
* Matrix matrix = new Matrix(); matrix.postRotate(90);
*
* mPhoto = Bitmap.createBitmap(mPhoto, 0, 0, width, height, matrix,
* true);
*/
mPhoto = rotateImage(mPhoto, 90, width, height);

getContentResolver().notifyChange(mUri, null);
Log.v(TAG,
"getOrientation : "
+ getOrientation(ChooseActivity.this,
photoFile.getAbsolutePath()));
return null;
}

@Override
protected void onPostExecute(Void result) {
progress.dismiss();
Intent intent = new Intent(ChooseActivity.this, FingerPaint.class);
intent.putExtra(BITMAP, mPhoto);
startActivityForResult(intent, EDIT_PICTURE);
}
}

public static int getOrientation(Context context, String imagePath) {
int rotate = 0;
try {
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);

switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}

Log.v("", "Exif orientation: " + orientation);
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
}




Step 2:-

Activity_choose.xml

<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:gravity="center|top"
    tools:context=".ChooseActivity" >

    <ImageView
        android:id="@+id/capturedImage"
        android:layout_width="150dip"
        android:layout_height="200dip"
        android:layout_centerHorizontal="true" />
    <!--
         <Button
        android:id="@+id/chooseGallery"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/choose_gallery"
        android:layout_below="@id/capturedImage" />
    -->

    <Button
        android:id="@+id/chooseCaptureFromCamera"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/capturedImage"
        android:text="@string/capture_camera" />

</RelativeLayout>



Step 3:-

CameraActivity.java



package com.example.paintapp;

import java.io.File;
import java.io.FileOutputStream;

import android.app.Activity;
import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class CameraActivity extends Activity {
private SurfaceView preview = null;
private SurfaceHolder previewHolder = null;
private Camera camera = null;
private boolean inPreview = false;
private boolean cameraConfigured = false;
private Button btnCancel, btnCapture;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);

preview = (SurfaceView) findViewById(R.id.preview);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

btnCancel = (Button) findViewById(R.id.btnCancel);
btnCapture = (Button) findViewById(R.id.btnCapture);

btnCapture.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (inPreview) {
camera.takePicture(null, null, photoCallback);
inPreview = false;
}
}
});

btnCancel.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// AddReportItemActivity.mPhoto =
// drawView.getDrawingCache();
setResult(ChooseActivity.FAILURE, intent);
finish();
}
});
}

@Override
public void onResume() {
super.onResume();

/*
* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
* Camera.CameraInfo info = new Camera.CameraInfo();
* for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
* Camera.getCameraInfo(i, info);
* if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { camera =
* Camera.open(i); } } }
*/

// if (camera == null) {
camera = Camera.open();
// }

startPreview();
}

@Override
public void onPause() {
if (inPreview) {
camera.stopPreview();
}

if (camera != null) {
camera.release();
camera = null;
}

inPreview = false;

super.onPause();
}

/*
* @Override public boolean onCreateOptionsMenu(Menu menu) { new
* MenuInflater(this).inflate(R.menu.activity_camera, menu);
* return (super.onCreateOptionsMenu(menu)); }
*/

private Camera.Size getBestPreviewSize(int width, int height,
Camera.Parameters parameters) {
Camera.Size result = null;

for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;

if (newArea > resultArea) {
result = size;
}
}
}
}

return (result);
}

private Camera.Size getSmallestPictureSize(Camera.Parameters parameters) {
Camera.Size result = null;

for (Camera.Size size : parameters.getSupportedPictureSizes()) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;

if (newArea < resultArea) {
result = size;
}
}
}

return (result);
}

private void initPreview(int width, int height) {
if (camera != null && previewHolder.getSurface() != null) {
try {
camera.setPreviewDisplay(previewHolder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(CameraActivity.this, t.getMessage(),
Toast.LENGTH_LONG).show();
}

if (!cameraConfigured) {
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = getBestPreviewSize(width, height, parameters);
Camera.Size pictureSize = getSmallestPictureSize(parameters);

if (size != null && pictureSize != null) {
parameters.setPreviewSize(size.width, size.height);
parameters.setPictureSize(pictureSize.width,
pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
cameraConfigured = true;
}
}
}
}

private void startPreview() {
if (cameraConfigured && camera != null) {
camera.setDisplayOrientation(90);
camera.startPreview();
inPreview = true;
}
}

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
initPreview(width, height);
startPreview();
}

public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
}
};

Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
new SavePhotoTask().execute(data);
// camera.startPreview();
// inPreview=true;
}
};

class SavePhotoTask extends AsyncTask<byte[], String, Integer> {
@Override
protected Integer doInBackground(byte[]... jpeg) {
File photo = new File(getIntent().getStringExtra(
ChooseActivity.IMAGE_PATH));

if (photo.exists()) {
photo.delete();
}

try {
FileOutputStream fos = new FileOutputStream(photo.getPath());

fos.write(jpeg[0]);
fos.close();
} catch (java.io.IOException e) {
return ChooseActivity.FAILURE;
}
return ChooseActivity.SUCCESS;
}

@Override
protected void onPostExecute(Integer result) {
if (result == ChooseActivity.SUCCESS) {
Intent intent = new Intent();
// AddReportItemActivity.mPhoto =
// drawView.getDrawingCache();
setResult(ChooseActivity.SUCCESS, intent);
finish();
} else {
Intent intent = new Intent();
// AddReportItemActivity.mPhoto =
// drawView.getDrawingCache();
setResult(ChooseActivity.FAILURE, intent);
finish();
}
}
}
}


Step 4:- 


Activity_camera.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.view.SurfaceView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/preview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >
    </android.view.SurfaceView>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/title_bar" >

        <Button android:id="@+id/btnCapture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/text_selector"
            android:layout_centerInParent="true" />
        <Button android:id="@+id/btnCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/cancel"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dip" />
    </RelativeLayout>

</LinearLayout>



Step 5:-

Screenshot



Capture Image


two : name 







Tap setting.



final image.




Source Code :


                                                   Download Full Source Code Here...


*************************************************************************Thank You Viewers************************************

No comments:

Post a Comment