本人也是菜鸟一枚, 这个简单的小项目也是参考了很多大神的文章。话不多说发代码!
package com.example.waterbitmap1;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.OnScanCompletedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView water_img;
private Button water_btn;
private Bitmap bitmap ;
private MediaScannerConnection msc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
photo();
}
private void photo() {
water_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 点击调用系统照相机程序,进行拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"model.jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, 1);
}
});
}
private void initUI() {
water_img = (ImageView) this.findViewById(R.id.water_img);
water_btn = (Button) this.findViewById(R.id.water_btn);
water_img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");// 相片类型
startActivityForResult(intent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==Activity.RESULT_OK)
{
//开始检测SD卡
if(MomeryUtils.externalMemoryAvailable())
{
//获取照片路径
String imageUri = Environment.getExternalStorageDirectory()+"/model.jpg";
//获取屏幕大小
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
//转动角度(改)
int readPictureDegree = readPictureDegree(imageUri);
//获取照片
bitmap = decodeSuitableBitmap(imageUri,width, height);
//转动完的图片(改)
Bitmap rotateBitmap = rotateBitmap(bitmap, readPictureDegree);
//添加水印和文字
Bitmap createBitmap = GreateWaterBitmap.createBitmap(rotateBitmap, "ff");
if(null!=createBitmap){
//保存水印照片
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
FileUtils.saveFile(createBitmap, sdf.format(new Date(System.currentTimeMillis()))+"1.jpg",this);
water_btn.setVisibility(View.GONE);
water_img.setImageBitmap(createBitmap);
}
}
}
}
public static Bitmap decodeSuitableBitmap(String uri,
int targetWidth, int targetHeight) {
// 空手套白狼
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(uri, options);
// 计算合适的inSampleSize
options.inSampleSize = getInSampleSize(options, targetWidth, targetHeight);
// 加载到内存
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(uri, options);
}
public static int getInSampleSize(BitmapFactory.Options options,
int targetWidth, int targetHeight) {
// 原始图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > targetHeight || width > targetWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRate = Math.round((float) height / (float) targetHeight);
final int widthRate = Math.round((float) width / (float) targetWidth);
inSampleSize = heightRate < widthRate ? heightRate : widthRate;
}
return inSampleSize;
}
//转动角度(改)
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/** (改)
* 旋转图片,使图片保持正确的方向。
* @param bitmap 原始图片
* @param degrees 原始图片的角度
* @return Bitmap 旋转后的图片
*/
public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
if (degrees == 0 || null == bitmap) {
return bitmap;
}
Matrix matrix = new Matrix();
matrix.setRotate(degrees, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
if (null != bitmap) {
bitmap.recycle();
}
return bmp;
}
}
照片保存
package com.example.waterbitmap1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.util.Log;
public class FileUtils {
/**
* 把图片村保存在相应的文件当中
* @param pBitmap
* @param pPathName
*/
public static void saveFile(Bitmap pBitmap,String fileName,Context context)
{
File file=new File("/sdcard/water_image");
if(!file.exists())
{
file.mkdirs();
}
String filePathName=file.getAbsolutePath()+"/"+fileName;
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filePathName);
pBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
MediaScannerConnection.scanFile(context, new String[]{filePathName}, null, null);//照片及时在相册更新
} catch (Exception e) {
e.printStackTrace();
}finally
{
if(fos!=null)
{
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
添加水印
package com.example.waterbitmap1;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.Bitmap.Config;
import android.text.format.Time;
public class GreateWaterBitmap {
private static String time;
private static String dateTime;
public static Bitmap createBitmap(Bitmap src, String str) {
getDateTime();
int w = src.getWidth();
int h = src.getHeight();
//水印文字
String mstrTitle = str+"时间:"+" "+dateTime+" "+time;;
Bitmap bmpTemp = Bitmap.createBitmap(w, h, Config.ARGB_8888);
Canvas canvas = new Canvas(bmpTemp);
Paint p = new Paint();
String familyName = "宋体";
Typeface font = Typeface.create(familyName, Typeface.BOLD);
p.setColor(Color.BLUE);
p.setTypeface(font);
p.setTextSize(22);
canvas.drawBitmap(src, 0, 0, p);
//文字画的地方
canvas.drawText(mstrTitle, w/2, h-20, p);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bmpTemp;
}
public static void getDateTime() {
Date d = new Date();
SimpleDateFormat datetime = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat hour = new SimpleDateFormat("HH:mm");
time = hour.format(d);
dateTime = datetime.format(d);
}
}
判断sd卡
package com.example.waterbitmap1;
public class MomeryUtils {
// 判断SD卡是否存在
public static boolean externalMemoryAvailable() {
return android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
}
}
希望对大家有帮助,有什么问题也可以交流。