Android 拍照或者从相册获取图片,加上水印并保存到本地(带效果图)

本文介绍了如何在Android应用中为拍摄或从相册选取的照片添加水印,并保存到手机相册。首先,提供了一个用于添加水印的静态方法,包括设置文字和图片水印,然后是一个保存图片到相册的函数。最后,展示了如何调用这些方法来完成整个流程。适用于Android 11以下版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

**本篇博客主要讲述拍照和从相册获取到图片,加上水印的效果,并保存到手机本地,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);

在这里插入图片描述

五、总结

**

标题

以上就是今天要讲的内容,之前代码里面有详细的拍照和从相册获取照片并且通过鲁班压缩的方法进行压缩数据大小,然后添加水印信息(如果大家有需要,会在后期发布<获取相册图片及压缩>)

**

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值