现在是维护知识产权的时代,很多时候app展示的图片会要求打上水印以强调自己对图片的知识产权。现在道长给大家分享一下给图片打水印的方法。额,这里道长已经写成一个简单的工具类。先把工具类的代码贴上:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;/*** Created by yushan on 2017-5-18.*/public class WatermarkHelper {private int imagePositionX = 0;private int imagePositionY = 0;private Bitmap src;private Bitmap watermark;private static Context mContext;private static WatermarkHelper watermarkHelper;public static final int WATERMARK_WITH_IMAGE = 120;public static final int WATERMARK_WITH_WRITE = 121;public static final int WATERMARK_WITH_IMAGE_AND_WRITE = 122;private String msg = "";private int mTextSize = 16;private int mTextColor = Color.BLACK;private int textPositionX = 0;private int textPositionY = dip2px(mContext, mTextSize);private WatermarkHelper() {}/*** 获取WatermarkHelper实例* @param context* @return*/public static WatermarkHelper getIntense(Context context) {mContext = context;watermarkHelper = new WatermarkHelper();return watermarkHelper;}/*** 设置背景图片* @param srcImageId* @return*/public WatermarkHelper setSourceImage(int srcImageId) {src = drawable2Bitmap(mContext, srcImageId);return watermarkHelper;}/*** 设置水印图片* @param watermarkId* @return*/public WatermarkHelper setWaterImage(int watermarkId) {watermark = drawable2Bitmap(mContext, watermarkId);return watermarkHelper;}/*** 设置水印图片位置* @param positionX* @param positionY* @return*/public WatermarkHelper setWatermarkPosition(int positionX, int positionY) {imagePositionX = dip2px(mContext, positionX);imagePositionY = dip2px(mContext, positionY);return watermarkHelper;}/*** 设置水印文字* @param message* @return*/public WatermarkHelper setWatermarkText(String message){msg = message;return  watermarkHelper;}/*** 设置水印文字大小* @param textSize* @return*/public WatermarkHelper setWatermarkTextSize(int textSize){mTextSize = textSize;return watermarkHelper;}/*** 设置水印文字颜色* @param textColor* @return*/public WatermarkHelper setWatermarkTextColor(int textColor){mTextColor = textColor;return watermarkHelper;}/*** 设置文字水印位置* @param positionX* @param positionY* @return*/public WatermarkHelper setWatermarkTextPosition(int positionX, int positionY){textPositionX = dip2px(mContext, positionX);textPositionY = dip2px(mContext, positionY);return watermarkHelper;}/*** 获取打上水印的图片* @param resultId* @return*/public Drawable getMarkedImage(int resultId) {Drawable newDrawable = null;switch (resultId){case WATERMARK_WITH_IMAGE:newDrawable = drawImage2Bitmap();break;case WATERMARK_WITH_WRITE:newDrawable = drawText2Bitmap();break;case WATERMARK_WITH_IMAGE_AND_WRITE:newDrawable = drawImgAndText2Bitmap();break;default:break;}if (newDrawable == null) {return null;}return newDrawable;}/*** 绘制带图片水印的图片* @return*/private Drawable drawImage2Bitmap() {if (src == null) {throw new NullPointerException();}int srcWidth = src.getWidth();int srcHeight = src.getHeight();// create the new blank bitmapBitmap newBitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(newBitmap);// draw src intocanvas.drawBitmap(src, dip2px(mContext, 0), dip2px(mContext, 0), null);// draw watermark intoif (watermark != null) {canvas.drawBitmap(watermark, imagePositionX, imagePositionY, null);}// save all clipcanvas.save(Canvas.ALL_SAVE_FLAG);// storecanvas.restore();Drawable newDrawable = bitmap2Drawable(newBitmap);return newDrawable;}/*** 绘制带文字水印的图片* @return*/public Drawable drawText2Bitmap() {if (src == null) {throw new NullPointerException();}// deal text position at Yif (mTextSize != 16 && textPositionY == dip2px(mContext, 16)){textPositionY = dip2px(mContext, mTextSize);} else if (mTextSize != 16 && textPositionY != dip2px(mContext, 16)){textPositionY = textPositionY + dip2px(mContext, mTextSize);}// resource bitmaps are imutable,// so we need to convert it to mutable onesrc = src.copy(src.getConfig().ARGB_8888, true);Canvas canvas = new Canvas(src);canvas.drawBitmap(src, 0, 0, null);// new antialised PaintPaint paint = new Paint(Paint.ANTI_ALIAS_FLAG);// text colorpaint.setColor(mTextColor);paint.setTextSize(dip2px(mContext, mTextSize));paint.setDither(true); //获取跟清晰的图像采样paint.setFilterBitmap(true);//过滤一些Rect bounds = new Rect();paint.getTextBounds(msg, 0, msg.length(), bounds);canvas.drawText(msg, textPositionX, textPositionY, paint);Drawable drawable = bitmap2Drawable(src);return drawable;}/*** 绘制带图片和文字水印的图片* @return*/public Drawable drawImgAndText2Bitmap() {if (src == null) {throw new NullPointerException();}// deal text position at Yif (mTextSize != 16 && textPositionY == dip2px(mContext, 16)){textPositionY = dip2px(mContext, mTextSize);} else if (mTextSize != 16 && textPositionY != dip2px(mContext, 16)){textPositionY = textPositionY + dip2px(mContext, mTextSize);}// resource bitmaps are imutable,// so we need to convert it to mutable onesrc = src.copy(src.getConfig().ARGB_8888, true);Canvas canvas = new Canvas(src);canvas.drawBitmap(src, 0, 0, null);// new antialised PaintPaint paint = new Paint(Paint.ANTI_ALIAS_FLAG);// text colorpaint.setColor(mTextColor);paint.setTextSize(dip2px(mContext, mTextSize));paint.setDither(true); //获取跟清晰的图像采样paint.setFilterBitmap(true);//过滤一些Rect bounds = new Rect();paint.getTextBounds(msg, 0, msg.length(), bounds);canvas.drawText(msg, textPositionX, textPositionY, paint);// draw watermark intoif (watermark != null) {canvas.drawBitmap(watermark, imagePositionX, imagePositionY, null);}// save all clipcanvas.save(Canvas.ALL_SAVE_FLAG);// storecanvas.restore();Drawable drawable = bitmap2Drawable(src);return drawable;}/*** drawable转换为Bitmap* @param context* @param drawableId* @return*/private static Bitmap drawable2Bitmap(Context context, int drawableId) {if (drawableId == -1) {return null;}BitmapDrawable bitmapDrawable = (BitmapDrawable) context.getResources().getDrawable(drawableId);Bitmap bitmap = bitmapDrawable.getBitmap();return bitmap;}/*** bitmap转换为drawable* @param bitmap* @return*/private static Drawable bitmap2Drawable(Bitmap bitmap) {if (bitmap == null) {return null;}Drawable drawable = new BitmapDrawable(bitmap);return drawable;}/*** 根据手机的分辨率从 dp 的单位 转成为 px(像素)*/private static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}}

使用方式如下

  • 在图片上打印图片水印
        // 图片水印Drawable drawable = WatermarkHelper.getIntense(this).setSourceImage(R.drawable.bg).setWaterImage(R.drawable.icon).setWatermarkPosition(50,50).getMarkedImage(WatermarkHelper.WATERMARK_WITH_IMAGE);if (drawable != null) {image.setImageDrawable(drawable);}
  • 在图片上打印文字水印
        // 文字水印Drawable drawable_text = WatermarkHelper.getIntense(this).setSourceImage(R.drawable.bg).setWatermarkTextSize(50).setWatermarkTextColor(Color.GRAY).setWatermarkTextPosition(50,50).setWatermarkText("雨幕青山").getMarkedImage(WatermarkHelper.WATERMARK_WITH_WRITE);if (drawable_text != null){image.setImageDrawable(drawable_text);}
  • 在图片上打印图片和文字水印
        // 图片和文字水印Drawable drawable_img_text = WatermarkHelper.getIntense(this).setSourceImage(R.drawable.bg).setWatermarkTextSize(30).setWatermarkTextColor(Color.GRAY).setWatermarkTextPosition(80,55).setWatermarkText("雨幕青山").setSourceImage(R.drawable.bg).setWaterImage(R.drawable.icon).setWatermarkPosition(30,50).getMarkedImage(WatermarkHelper.WATERMARK_WITH_IMAGE_AND_WRITE);if (drawable_img_text != null){image.setImageDrawable(drawable_img_text);}

最后在贴一张在图片上打印图片和文字水印的效果图:

给图片打水印的工具类编写的比较简单,勉强能够使用,小伙伴们可以自己拓展一下功能。好了,希望这篇博客能够给小伙伴们提供一些帮助。

android:给图片打水印相关推荐

  1. Android实现图片加水印,视频水印

    Android实现图片加水印,视频加水印 推荐经典用例,超级简单的视频加水印,图片加水印功能. 视频加水印: Android拍视频加水印功能 图片加水印 Android轻松实现拍照加水印

  2. Android——为图片增加水印,并且保存到图库刷新

    为图片增加水印我们可以通过canvas来绘制,首先我们新创建一个工具类: object WaterMarkHelper {fun createWaterMaskBitmap(context: Acti ...

  3. android给图片加水印的极简实现方式

    工作日志:其实这是两年前就碰到的需求,之前没有整理,也没有继续优化和实现,这次又用到这样的需求,所以记录下来,既是一种代码记录,也是一种复习bitmap和canvas的好手段,这里提供一种思路,就是将 ...

  4. Android给图片加水印

    try { ImageView img=(ImageView) findViewById(R.id.test_img_file); //获取从本地获取的文件路径,用FileInputstream读入文 ...

  5. android 给图片加水印

    生成水印照片类 package com.chinawit.cwandroidbase.Infrastructure.CWComponent.CWImage.WaterMark; import andr ...

  6. android 照片加水印,Android 实现图片加水印或logo

    我们常常会遇到为图像加水印或logo的需求,一般可以通过三方库或者软件实现,但其实加水印非常简单,仅用一个函数即可实现. 实现思路,逐一计算水印和原图重叠部分的像素点的RGBA分量: float pe ...

  7. Android图片打水印

    shuiyin.jpg 手机端打水印(文字和图片)使用的是Bitmap.Matrix和Canvas类的一些方法, 可以实现拉伸.旋转.位移等等效果. 原理很简单, 就是在画布Canvas上绘制图形.图 ...

  8. android实现自定义相机以及图片的水印

    最近在做图片的水印功能,也就研究了一下android的相机.在android中有两种方式可以进行拍照,一种是调用系统的拍照功能调用方式比较简单而且不需要权限. 调用方式: //照相机中获取照片publ ...

  9. android 给图片加文字、图片水印

    Stamper is a tool for stamping a pattern into a picture,it likes a watermark. Stamper是一个给图片打水印的工具,支持 ...

最新文章

  1. python报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode解决方案
  2. 用BP人工神经网络识别手写数字——《Python也可以》之三
  3. C++ Primer 5th笔记(chap 17 标准库特殊设施)子表达式subexpression
  4. Python对字符串进行左右中对齐
  5. Springmvc的handler method参数绑定常用的注解
  6. 方立勋_30天掌握JavaWeb_(JSP+JavaBean实现)简单计算器
  7. Shuffle'm Up——简单模拟
  8. word2016 图片去底灰_看来看去,还是高级灰最耐看,喜欢现代简约风的你,选它准不会错...
  9. 开多线程出现importerror_那些年让你迷惑的并行、并发、多线程、多进程、协程...
  10. pyspark的ALS协同过滤推荐算法-小结1
  11. 【java学习之路】(java SE篇)005.面向对象基础入门part2
  12. 外挂技术之-检测和反检测
  13. 常用数学符号的英文读法
  14. 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
  15. 服务器认证信息,认证信息管理系统、服务器、方法和程序
  16. C/C++语言编程规范
  17. android手机变微软手机号码,微软Your Phone未来将能让你用电脑远程控制拨打Android手机电话...
  18. gpg生成秘钥时卡死
  19. android wps 连接wifi密码,怎样在不知道密码的情况下连接WiFi?
  20. 前端gitlab-ci打包流水线优化

热门文章

  1. ASP .NET Core 的运行机制和启动(转)
  2. 如何在Windows Server 2012中手动启用无线网络?
  3. Lazada9.9大促在即,东南亚居民疯狂抢购的产品都在这里
  4. matlab x y 坐标,已知(x,y,z)坐标,如何用matlab作三维曲线?
  5. linux系统分辨率没有,Linux装完显卡驱动后分辨率无法正常显示怎么办?
  6. i9 10850k和i9 9900k 的区别
  7. ILRuntime(一)
  8. 常用ASCII码值以及大小写字母转换
  9. 【腾讯云Finops Crane集训营】利用云原生成本优化项目实现降本增效泰裤辣~
  10. 大数据-hadoop