安卓照相加水印

昨天公司项目需要做一个头像签到功能,并且加上水印,水印内容为:时间+地点。

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

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

/**
	 * 调用系统相机拍照,获得照片的返回值
	 */
	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;

	}

}


 

时候不早了,今天就说道这里。每天说一下前面做的,不但自己总结了,顺带给别人留下相关资料。方便自己,服务他人。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值