给图片添加文字(换行)水印

Android给图片添加半透明背景的水印 (水印带有半透明底色)

给图片添加文字(换行)水印

在这里插入图片描述

1、绘制富文本:

/**
* 绘制富文本
 * StaticLayout可实现换行
 * <p>
 * https://my.oschina.net/djonce/blog/805912
 *
 * @param context
 * @param bitmap      背景图片
 * @param text        文字内容
 * @param size        文字大小
 * @param color       文字颜色
 * @param paddingLeft
 * @param paddingTop
 * @param position    方位:1左上;2右上;3右下;4左下
 * @return
 */
public static Bitmap drawRichText(Context context, Bitmap bitmap, String text,
                                  int size, int color, int paddingLeft, int paddingTop, int position) {
    if (TextUtils.isEmpty(text)) {
        return bitmap;
    }

    paddingLeft = dp2px(context, paddingLeft);
    paddingTop = dp2px(context, paddingTop);

    Bitmap.Config bitmapConfig = bitmap.getConfig();

    if (bitmapConfig == null) {
        bitmapConfig = Bitmap.Config.ARGB_8888;
    }
    bitmap = bitmap.copy(bitmapConfig, true);
    Canvas canvas = new Canvas(bitmap);
    // 画背景图
    canvas.drawBitmap(bitmap, 0, 0, null);


    //创建画笔
    TextPaint mPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
    //文字矩阵区域
    Rect bounds = new Rect();

    mPaint.setColor(color);
    mPaint.setTextSize(dp2px(context, size));
    // 水印的区域
    mPaint.getTextBounds(text, 0, text.length(), bounds);
    // 文字阴影
//        mPaint.setShadowLayer(0.5f, 0f, 1f, Color.YELLOW);
    mPaint.setDither(true); // 获取跟清晰的图像采样
    mPaint.setFilterBitmap(true);// 过滤一些
    // 抗锯齿
    mPaint.setAntiAlias(true);

    StaticLayout layout = new StaticLayout(text, mPaint, canvas.getWidth() - paddingLeft - paddingLeft, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
    //文字坐标
    if (position == 1) {
        //左上
        canvas.translate(paddingLeft, paddingTop);
    } else if (position == 2) {
        //右上
        canvas.translate(canvas.getWidth() - bounds.width() - paddingLeft, paddingTop);
    } else if (position == 3) {
        //右下
        canvas.translate(canvas.getWidth() - bounds.width() - paddingLeft,
                canvas.getHeight() - bounds.height() - paddingTop);
    } else if (position == 4) {
        //左下
        canvas.translate(paddingLeft, canvas.getHeight() - bounds.height() - paddingTop);
    }
    layout.draw(canvas);

    //保存所有元素
    canvas.save(Canvas.ALL_SAVE_FLAG);
    canvas.restore();
    return bitmap;
}

方法调用:

注意:文本信息使用\n换行。

String  watermarkTime = "地点:北京市\n时间:2020-09-11 16:44:23" ;
Bitmap bitmap = PictureUtil.drawRichText(mContext, bitmap, watermarkTime, 6,Color.RED, 10, 10, 1);

2、同时添加多个水印(日期+地点):

/**
     * 绘制富文本
     * StaticLayout可实现换行
     * @return
     */
    public static Bitmap getWatermarkBitmap(Context context, String localUrl, String dateTimeStr, String address) {
        int paddingTop = dp2px(context, 10);
        Bitmap bitmap = BitmapFactory.decodeFile(localUrl);
        Bitmap.Config bitmapConfig = bitmap.getConfig();

        if (bitmapConfig == null) {
            bitmapConfig = Bitmap.Config.ARGB_8888;
        }
        bitmap = bitmap.copy(bitmapConfig, true);
        Canvas canvas = new Canvas(bitmap);

        //创建画笔
        TextPaint mPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(ContextCompat.getColor(context, R.color.white1));
        mPaint.setTextSize(dp2px(context, 18));
        // 文字阴影
//        mPaint.setShadowLayer(0.5f, 0f, 1f, Color.YELLOW);
        mPaint.setDither(true); // 获取跟清晰的图像采样
        mPaint.setFilterBitmap(true);// 过滤一些
        // 抗锯齿
        mPaint.setAntiAlias(true);

        //日期
        Rect rect1 = new Rect();
        mPaint.getTextBounds(dateTimeStr, 0, dateTimeStr.length(), rect1);
        int datePadding = (bitmap.getWidth() - rect1.width()) / 2;
        canvas.drawText(dateTimeStr, datePadding, paddingTop * 4, mPaint);

        //地址
        Rect rect2 = new Rect();
        mPaint.getTextBounds(address, 0, address.length(), rect2);   // 水印的区域
        //文本自动换行
        StaticLayout layout = new StaticLayout(address, mPaint, bitmap.getWidth() - paddingTop * 2, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
        canvas.translate(paddingTop, bitmap.getHeight() - paddingTop * 6 - rect2.height());
        layout.draw(canvas);

        //保存所有元素
        canvas.save();
        canvas.restore();
        return bitmap;
    }

方法调用:


   val bitmap = PictureUtil.getWatermarkBitmap2(
       this,
       "$targetPath/test.jpg",
       "2022-03-14 16:54:35",
       "不生我李淳罡,剑道万古长如夜,这句话出自网脱落小说《雪中悍刀行》",
   )

StaticLayout的使用详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值