提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
**本篇博客主要讲述拍照和从相册获取到图片,加上水印的效果,并保存到手机本地,Android 11以下可用(第一次发布没啥经验,有什么不好的地方可以多提下意见)**一、版本环境
二、添加水印的方法 (封装好的方法)
public static Bitmap createBitmap(Bitmap src, Bitmap waterMak, String title, String location) {
if (src == null) {
return src;
}
int width = src.getWidth();
int height = src.getHeight();
Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(newBitmap);
// 往位图中开始画入src原始图片
mCanvas.drawBitmap(src, 0, 0, null);
if(null != waterMak){
int ww = waterMak.getWidth();
int wh = waterMak.getHeight();
// 在src的右下角添加水印
Paint paint = new Paint();
//paint.setAlpha(100);
mCanvas.drawBitmap(waterMak, width - ww - 5, height - wh - 5, paint);
}
// 开始加入文字
if (null != title) {
Paint textPaint = new Paint();
//设置字体颜色
textPaint.setColor(Color.RED);
//设置字体大小
int i = (width + height) / 300 * 5;
textPaint.setTextSize(i);
//阴影设置
textPaint.setShadowLayer(3f, 1, 1, Color.DKGRAY);
String familyName = "宋体";
Typeface typeface = Typeface.create(familyName,
Typeface.BOLD_ITALIC);
textPaint.setTypeface(typeface);
textPaint.setTextAlign(Paint.Align.CENTER);
TextPaint textPaint2 = new TextPaint();
//设置字体颜色
textPaint2.setColor(Color.RED);
//设置字体大小
//根据图片大小设置字体大小
textPaint2.setTextSize(i);
//阴影设置
textPaint2.setShadowLayer(3f, 1, 1, Color.DKGRAY);
String familyName2 = "宋体";
Typeface typeface2 = Typeface.create(familyName2,
Typeface.BOLD_ITALIC);
textPaint2.setTypeface(typeface2);
textPaint2.setTextAlign(Paint.Align.CENTER);
float textWidth = textPaint2.measureText(title);
//文字 添加位置
mCanvas.drawText(title, textWidth/2+50, 100, textPaint); //时间
StaticLayout layout = new StaticLayout(location, textPaint2, width/2, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
Log.e("aaa","textWidth:"+textWidth+"width:"+width);
mCanvas.translate( width/4, 150);
layout.draw(mCanvas);
}
mCanvas.save();
//保存
mCanvas.restore();
return newBitmap;
}
三、保存到相册的方法 (封装好的方法)
public void saveImageToGallery2(Bitmap image) {
long timeStamp = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sd = sdf.format(new Date(timeStamp));
String fileName = sd + ".png";
final ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES
+ File.separator + "erweima16"); //Environment.DIRECTORY_SCREENSHOTS:截图,图库中显示的文件夹名。"dh"
values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
values.put(MediaStore.MediaColumns.DATE_ADDED, timeStamp / 1000);
values.put(MediaStore.MediaColumns.DATE_MODIFIED, timeStamp / 1000);
values.put(MediaStore.MediaColumns.DATE_EXPIRES, (timeStamp + DateUtils.DAY_IN_MILLIS) / 1000);
values.put(MediaStore.MediaColumns.IS_PENDING, 1);
ContentResolver resolver = getContentResolver();
final Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try {
// First, write the actual data for our screenshot
try (OutputStream out = resolver.openOutputStream(uri)) {
if (!image.compress(Bitmap.CompressFormat.PNG, 100, out)) {
throw new IOException("Failed to compress");
}
}
// Everything went well above, publish it!
values.clear();
values.put(MediaStore.MediaColumns.IS_PENDING, 0);
values.putNull(MediaStore.MediaColumns.DATE_EXPIRES);
resolver.update(uri, values, null, null);
} catch (IOException e) {
resolver.delete(uri, null);
}
}
四、调用
//将图片文件转换为bitmap(调用相机和相册获取到的图片文件信息转换为bitmap类型,然后规范时间戳数据和需要定义的字符串信息添加到图片上面,调用封装好的方法)
Bitmap bitmap=BitmapFactory.decodeFile(String.valueOf(compressFile));
//格式化时间数据
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(new Date().getTime());
//添加时间数据和其他数据,如获取到的地理位置数据
Bitmap img = createBitmap(bitmap, null, time,"位置信息:位置信息:位置信息:位置信息:位置信息:位置信息:位置信息:位置信息:位置信息:位置信息: ");
//将剪裁后照片显示出来
ima.setImageBitmap(img);
//水印图片保存到相册(需要保存到相册的话调用这个方法)
saveImageToGallery2(img);
五、总结
**
标题
以上就是今天要讲的内容,之前代码里面有详细的拍照和从相册获取照片并且通过鲁班压缩的方法进行压缩数据大小,然后添加水印信息(如果大家有需要,会在后期发布<获取相册图片及压缩>)
**