您的位置:首页 > 移动开发 > Android开发

安卓照相加水印

2015-07-22 23:53 711 查看
昨天公司项目需要做一个头像签到功能,并且加上水印,水印内容为:时间+地点。

拿到模块的时候,觉得还是相对较简单,首先打开系统相机拍照,获得系统相机的照片后,新建一个一样大的画板,再把照片贴到画板上面,这个时候创建画笔,指定画笔的样式,再把时间、地点画到画板上面去,最后保存画板。

既然思路有了,那么,第一步打开相机获取照片:

/**
* 调用系统相机拍照,获得照片的返回值
*/
private void takephoto() {
// 打开系统照相机
cameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 图片缓存位置
photofile = new File(filepath, photosName() + ".jpg");
imgurl = Uri.fromFile(photofile);
// 输出缓存图片位置
Log.e("缓存照片路径:", imgurl.toString());
// 拍照完成,返回用户应用界面,传递
cameraintent.putExtra(MediaStore.EXTRA_OUTPUT, imgurl);
startActivityForResult(cameraintent, 1);

}

  上面这段打开相机的代码加入到我们的事件响应中,就能完成打开相机了。

但是单开系统相机后,我们拍照完成了,就需要拿一个对应的返回值,获得我们的照片。代码如下:

 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//打开系统相机后,反回来照片,并加上水印
if (resultCode == RESULT_OK) {
//设置界面布局的隐藏和显示
takephotolayout.setVisibility(View.GONE);
imageshowlayout.setVisibility(View.VISIBLE);
//设定bitmap的需要的文件路径
Bitmap camorabitmap = BitmapFactory.decodeFile(photofile
.getAbsolutePath());
//当照片存在时
if (null != camorabitmap) {
//打开工具类的图片加水印方法,传入照片
bitmap = ImageThumbnail.addwatermark(camorabitmap, "时间time:"+time,
"地点place:"+place);
System.err.println("输出图片的长和宽" + bitmap.getWidth() + "::"
+ bitmap.getHeight());
// 由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常
camorabitmap.recycle();
// 将处理过的图片显示在界面上
photoshow.setImageBitmap(bitmap);

}
//设定文件名
String imagename = "1231231asdas";
//保存文件到本地,初始化文件输出流
FileOutputStream b = null;
//指定文件路径
//final String filepath = Environment.getExternalStorageDirectory()+ "/photos";
String fileName = filepath + "/" + imagename + ".jpg";

try {
b = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(CameraMainActivity.this, "加水印后的照片保存成功",
Toast.LENGTH_LONG).show();

}
}
}


虽然说,上面我们把图片拿出来了,也保存了。但是呢,核心对图片的处理还是没有写出来,看官别急,代码如下:

 

public class ImageThumbnail {

/**
* 插入文字水印
*
* @param bmp
*            原图片
* @param timestr
*            时间字符串
* @param placestr
*            地点字符串
* @return 若有图片传入,则返回加了水印的图片,若无,则为null
*/
public static Bitmap addwatermark(Bitmap bmp, String timestr,
String placestr) {
// 初始化图片缓存
Bitmap newBitmap = null;
if (bmp != null) {
// 当图片存在时,获取原始图片的宽与高
int w = bmp.getWidth();
int h = bmp.getHeight();
Log.e("传入图片的长和宽", w + "::" + h);
newBitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);
Canvas mCanvas = new Canvas(newBitmap);
// 往位图中开始画入bmp原始图片
mCanvas.drawBitmap(bmp, 0, 0, null);
// 开始加入文字
if (null != timestr && null != placestr) {
// 初始化画笔
Paint textPaint = new Paint();
// 设定画笔颜色为红色
textPaint.setColor(Color.RED);
// 设定画笔字体大小
textPaint.setTextSize(50);
// 设定字体
String familyName = "宋体";
// 通过字体名字,创建字体对象,并且选择风格。
Typeface typeface = Typeface.create(familyName,
Typeface.BOLD_ITALIC);
textPaint.setTypeface(typeface);
textPaint.setTextAlign(Align.RIGHT);
mCanvas.drawText(timestr, w - w / 4, h - h / 4, textPaint);
//设定文字绘制的位置				mCanvas.drawText(placestr, w - w / 4, h - h / 4 + 55, textPaint);

}
mCanvas.save(Canvas.ALL_SAVE_FLAG);
mCanvas.restore();

}
return newBitmap;

}

}


 

时候不早了,今天就说道这里。每天说一下前面做的,不但自己总结了,顺带给别人留下相关资料。方便自己,服务他人。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 照片加水印