昨天需要添加照片水印的功能,google后找到了博客大v 水寒的文章 对我帮助很大 http://blog.csdn.net/dawanganban/article/details/51148070
大v的文章 很有深度 非常有用
添加水印有了大v的工具类不成问题 但是在获取拍照后返回的图片时,由于使用的是拍照后的缩略图,导致处理后图片模糊不清;所以想到了先保存原图,再通过原图添加水印(以下方式,获取的是稍大的缩略图,比系统默认的清晰);
1.先设置拍照后的文件路径
String photoName = UtilTools.getFileName(1);
2.通过Intent调用系统相机
Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(photoName)));
intent1.putExtra("return-data", true);// 不加有时会返回data为空
startActivityForResult(intent1, 1);
3.处理返回值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case HttpServer.REQUEST_CAPTURE_IMAGE:
UtilTools.makePhoto(getBaseContext(),photoName);
Bitmap bitmap = UtilTools.convertToBitmap(photoName, 100, 100);
ImageView imgview = new ImageView(MainActivity.this);
imgview.setImageBitmap(bitmap);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
用到的工具类
1.getFileName: 设置文件名字
public static String getFileName(int requestCode) {
SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA);
Date curDate = new Date(System.currentTimeMillis());
String name = formater.format(curDate);
if (requestCode == 1)
name = SdcardPath.sdPicPath() + name + ".jpg";
else if (requestCode == 2)
name = SdcardPath.sdVedioPath() + name + ".mp4";
return name;
}
2.sdPicPath 设置保存路径
/**
* 判断是否存在照片存储的路径,不存在则创建
*/
public static String sdPicPath() {
File sd = Environment.getExternalStorageDirectory();
String path = sd.getPath() + "/DIST_File/Picture";
File dir = new File(path);
if (!dir.exists())
dir.mkdirs();
return path + "/";
}
3.UtilTools.makePhoto 添加水印并保存文件
//添加图片水印 并保存
public static void makePhoto(Context context, String photoName) {
FileOutputStream b = null;
Bitmap bitmap = UtilTools.convertToBitmap(photoName, 500, 500); //获取原图的缩略图500*500
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.CHINA);
Date curDate = new Date(System.currentTimeMillis());
String date = formater.format(curDate); //获取当前的日期事件信息
if (bitmap != null) {
Bitmap bitmap1 = ImageUtil.drawTextToLeftBottom(context, bitmap, date, 16, Color.RED, 45, 30); //添加第一个时间水印
Bitmap bitmap2 = ImageUtil.drawTextToLeftBottom(context, bitmap1, HndistConstant.X_Yzuobiao, 16, Color.RED, 45, 20); //添加坐标水印
try {
b = new FileOutputStream(photoName);
bitmap2.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把图片数据写入指定的文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (b != null) {
b.flush(); //刷新输出流
b.close(); //关闭输出流
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.UtilTools.convertToBitmap 获取图片的压缩文件
/**
* 压缩图片为位图
*/
public static Bitmap convertToBitmap(String path, int w, int h) {
BitmapFactory.Options opts = new BitmapFactory.Options();
// 设置为ture只获取图片大小
opts.inJustDecodeBounds = true;
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
// 返回为空
BitmapFactory.decodeFile(path, opts);
int width = opts.outWidth;
int height = opts.outHeight;
float scaleWidth = 0.f, scaleHeight = 0.f;
if (width > w || height > h) {
// 缩放
scaleWidth = ((float) width) / w;
scaleHeight = ((float) height) / h;
}
opts.inJustDecodeBounds = false;
float scale = Math.max(scaleWidth, scaleHeight);
opts.inSampleSize = (int) scale;
WeakReference<Bitmap> weak = new WeakReference<>(
BitmapFactory.decodeFile(path, opts));
return Bitmap.createBitmap(weak.get());
}
经过一番折腾 终于获取了 想要的图片 美中不足的是水印有点模糊 整体效果还好
IMG_20161101_100806_HDR.jpg
网友评论
int height = opts.outHeight;这两个参数的问题,