安卓照相加水印
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; } }
时候不早了,今天就说道这里。每天说一下前面做的,不但自己总结了,顺带给别人留下相关资料。方便自己,服务他人。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories