android 添加全屏图片水印

先上效果图

android 添加全屏图片水印_第1张图片

要实现上图效果分两步

1.拷贝帮助类到项目中

创建AddWatermarkUtil.java     把下面代码拷贝进去

//package com.myapplication11;这是我的包名,改成你自己的包名


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;

import java.math.BigDecimal;

/**
 * 添加水印图片帮助类
 */
public class AddWatermarkUtil {

    /**
     * 添加logo水印
     *
     * @param src  原图片
     * @param logo logo
     * @return 水印图片
     */
    public static Bitmap createWaterMaskImage(Context context, Bitmap src, Bitmap logo) {
        if (src == null) {
            return null;
        }
        //原图宽高
        int w = src.getWidth();
        int h = src.getHeight();
        //水印图宽高
        int ww = logo.getWidth();
        int wh = logo.getHeight();

        int neww = w / 4; //设置水印图宽度为原图宽度的四分之一(设置水印宽度,高度不用设置,高度是按照宽度自动缩放)
        int newh = (int) (wh * div(neww, ww, 2));//按照宽度设置高度缩放比
        Bitmap newLogo = imageScale(logo, neww, newh);//根据宽高创建新的水印图

        //创建一个和原图宽高一样的bitmap
        Bitmap newBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);
        //创建
        Canvas canvas = new Canvas(newBitmap);
        //绘制原始图片
        canvas.drawBitmap(src, 0, 0, null);

        //画布旋转-30度
        canvas.rotate(-30);

        int rowh = h / 15;  //每一行的间距,默认值为高度的十五分之一
        int mPadding = neww * 3 / 4;  //图片的间距,默认值为水印宽度的四分之三
        //行循环,从高度为0开始,向下每隔80dp开始绘制文字
        for (int positionY = -h; positionY <= h+500; positionY += dip2px(context, rowh)) {

            //列循环,从每行的开始位置开始,向右每隔2倍宽度的距离开始绘制(文字间距1倍宽度)
            for (float positionX = -w; positionX < w+500; positionX += dip2px(context, mPadding)) {
                canvas.drawBitmap(newLogo, positionX, positionY, null);
            }
        }
        //保存当前画布状态
        canvas.save();
        canvas.restore();
        return newBitmap;
    }

    /**
     * drawable图片转bitmap
     * @param drawable
     * @return
     */
    public static Bitmap drawable2Bitmap(Drawable drawable) {
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        } else if (drawable instanceof NinePatchDrawable) {
            Bitmap bitmap = Bitmap
                    .createBitmap(
                            drawable.getIntrinsicWidth(),
                            drawable.getIntrinsicHeight(),
                            drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                    : Bitmap.Config.RGB_565);
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                    drawable.getIntrinsicHeight());
            drawable.draw(canvas);
            return bitmap;
        } else {
            return null;
        }
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 调整图片大小
     *
     * @param bitmap 源
     * @param dst_w  输出宽度
     * @param dst_h  输出高度
     * @return
     */
    public static Bitmap imageScale(Bitmap bitmap, int dst_w, int dst_h) {
        int src_w = bitmap.getWidth();
        int src_h = bitmap.getHeight();
        float scale_w = ((float) dst_w) / src_w;
        float scale_h = ((float) dst_h) / src_h;
        Matrix matrix = new Matrix();
        matrix.postScale(scale_w, scale_h);
        Bitmap dstbmp = Bitmap.createBitmap(bitmap, 0, 0, src_w, src_h, matrix,
                true);
        return dstbmp;
    }

}

2.准备好原图和水印图放到项目中,调用帮助类的方法即可

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //将原图转换成bitmap
        Bitmap bmpYT = AddWatermarkUtil.drawable2Bitmap(getResources().getDrawable(R.mipmap.yt));

        //将水印图转换成bitmap
        Bitmap bmpSY  = AddWatermarkUtil.drawable2Bitmap(getResources().getDrawable(R.mipmap.sy));

        //最主要的就是这个方法,第一个参数是上下文,第二个参数是原图,第三个参数是水印图,最终把合成的图片返回
        Bitmap bitmap = AddWatermarkUtil.createWaterMaskImage(this,bmpYT,bmpSY);

        ImageView imageView = findViewById(R.id.imageView);
        imageView.setImageBitmap(bitmap);

    }
}

可以了,就这么简单

 

如果你对水印图不是很满意,比如说水印太大或太小;行距,边距不满意那修改AddWatermarkUtil.java就可以了,源代码在这里哪里不满意修改哪里

neww    水印的大小,设置水印宽度,高度不用设置,高度是按照宽度自动缩放

rowh      每一行的间距,默认值为高度的十五分之一

mPadding   图片的间距,默认值为水印宽度的四分之三

这三个值都在AddWatermarkUtil.java里面,都有详细的备注

将AddWatermarkUtil.java大概看一编,要怎么微调就分分钟钟了

 

小弟不才,写得比较粗略,在此也感谢以下大佬的分享

https://blog.csdn.net/qby_nianjun/article/details/79248635

 

 

 

 

 

 

 

 

你可能感兴趣的:(android 添加全屏图片水印)