Android 图片添加水印的实现方法

作者:brycegao321 时间:2023-11-20 01:13:29 

Android 图片添加水印的实现方法

实现效果图:

Android 图片添加水印的实现方法

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

百度搜索图片打水印有很多结果, 没找到斜着打水印的代码,有很多公司都要求上图的效果, 所以写着玩玩。


/*
  添加全屏斜着45度的文字
  /
 public static Bitmap drawCenterLable(Context context, Bitmap bmp, String text) {
   float scale = context.getResources().getDisplayMetrics().density;
   //创建一样大小的图片
   Bitmap newBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.ARGB_8888);
   //创建画布
   Canvas canvas = new Canvas(newBmp);
   canvas.drawBitmap(bmp, 0, 0, null);  //绘制原始图片
   canvas.save();
   canvas.rotate(45); //顺时针转45度
   Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
   paint.setColor(Color.argb(50, 255, 255, 255)); //白色半透明
   paint.setTextSize(100 scale);
   paint.setDither(true);
   paint.setFilterBitmap(true);
   Rect rectText = new Rect();  //得到text占用宽高, 单位:像素
   paint.getTextBounds(text, 0, text.length(), rectText);
   double beginX = (bmp.getHeight()/2 - rectText.width()/2) * 1.4;  //45度角度值是1.414
   double beginY = (bmp.getWidth()/2 - rectText.width()/2) * 1.4;
   canvas.drawText(text, (int)beginX, (int)beginY, paint);
   canvas.restore();
   return newBmp;
 }

使用44KB的png图片验证效率:


long begin = System.currentTimeMillis();
Bitmap destBmp = ImageUtil.drawCenterLable(this, sourBitmap, "某某公司专用");
long end = System.currentTimeMillis();
Log.d("brycegao", "打水印用时:" + (end-begin) + "毫秒");
mWartermarkImage.setImageBitmap(destBmp);

小米4手机输出: D/brycegao: 打水印用时:69毫秒

使用3M字节的jpg图片测试打水印,报OOM错误。


java.lang.OutOfMemoryError: Failed to allocate a 467251212 byte allocation with 16767536 free bytes and 110MB until OOM
                                       at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                       at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                       at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:613)
                                       at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:446)
                                       at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:469)
                                       at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:501)

手机端使用Android原生方法打水印, 应该先将压缩分辨率, 避免OOM的情况, 但是影响清晰度; 大部分app都是将原图传到服务器, 在后台打水印。

因为原生方法有分辨率和内存限制, 听说七牛的图片库(支持打水印)很好用, 看看是否可以落地到各种配置的android手机中。

来源:http://blog.csdn.net/brycegao321/article/details/54312775

标签:Android,水印
0
投稿

猜你喜欢

  • C#8 的模式匹配实现

    2023-02-11 16:22:16
  • ajaxFileUpload插件,C#返回Json数据报错问题的解决方案

    2022-10-22 14:26:55
  • Android如何使用GestureDetector进行手势检测详解

    2022-03-21 22:08:46
  • C#实现简单的计算器小功能

    2023-05-13 06:46:11
  • spring boot和mybatis集成分页插件

    2021-11-05 10:21:17
  • C#不提升自己程序的权限实现操作注册表

    2023-01-24 18:51:31
  • C#集合之集(set)的用法

    2023-05-18 06:04:53
  • Android自定义gridView仿头条频道拖动管理功能

    2022-09-08 00:11:41
  • Java算法实战之排一亿个随机数

    2022-11-22 02:47:26
  • Android模块化中数据传递/路由跳转实现示例

    2023-06-29 03:12:06
  • Android 使用Pull方法解析XML文件的方法

    2021-08-11 21:02:16
  • java 发送带Basic Auth认证的http post请求实例代码

    2021-11-03 06:21:20
  • Android RecyclerView添加上拉加载更多功能

    2022-08-02 00:03:51
  • IntelliJ IDEA各种图标的含义

    2022-08-12 21:50:25
  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    2021-07-07 21:11:57
  • 解析C#中@符号的几种使用方法详解

    2022-11-09 03:26:03
  • android Activity相对布局的使用方法

    2022-12-11 01:12:50
  • Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理

    2022-10-27 05:03:36
  • Java线程池必知必会知识点总结

    2021-07-30 13:08:02
  • 使用JSONObject生成和解析json的方法

    2022-06-15 11:13:15
  • asp之家 软件编程 m.aspxhome.com