android图像处理系列之七--图片涂鸦,水印-图片叠加(转载)

图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可。前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操作像素点。下面给出别外一种方式让图片叠加--用Canvas处理图片,canvas已经封装好了,直接调用就行。

下面看效果:

 

+

=

 

代码:

 

  1. /** 
  2.      * 组合涂鸦图片和源图片 
  3.      * @param src 源图片 
  4.      * @param watermark 涂鸦图片 
  5.      * @return 
  6.      */  
  7.     public Bitmap doodle(Bitmap src, Bitmap watermark)  
  8.     {  
  9.         // 另外创建一张图片  
  10.         Bitmap newb = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图  
  11.         Canvas canvas = new Canvas(newb);  
  12.         canvas.drawBitmap(src, 00null);// 在 0,0坐标开始画入原图片src  
  13.         canvas.drawBitmap(watermark, (src.getWidth() - watermark.getWidth()) / 2, (src.getHeight() - watermark.getHeight()) / 2null); // 涂鸦图片画到原图片中间位置  
  14.         canvas.save(Canvas.ALL_SAVE_FLAG);  
  15.         canvas.restore();  
  16.           
  17.         watermark.recycle();  
  18.         watermark = null;  
  19.           
  20.         return newb;  
  21.     }  


跟前面一样,要注意图片最好放在assets目录,另外注意图片回收,不然图片过到会造成内存紧张。这种叠加方式一般选用PNG格式的图片做为涂鸦图片或者水印,当然也可以用JPG,那就需要按照前面所说的android图像处理系列之六--给图片添加边框(下)-图片叠加进行像素点过滤,这样会影响处理速度,所以不建议用JPG图片,如果能写更高效的算法,也可以。

另外在做涂鸦的时候,需求可能会是用户可以按住涂鸦图片,然后进行拖动效果。这样的话,我给个思路,重写ImageView里面的onTouchEvent方法,MotionEvent.getAction()里面有三种状态,MotionEvent.ACTION_DOWN、MotionEvent.ACTION_UP和MotionEvent.ACTION_MOVE,根据这三种状态来判断用户的行为,决定是否移动图片,另外要注意判断涂鸦图片是否移动到原图片的边缘。由于这部分代码是跟裁剪放在一样的,不好贴出来,所以给大家一个思路,后面会把裁剪的代码贴出来。

OK,这篇就写到这里,后面还有一种图片叠加的方式,敬请期待!

 

如有遗漏之处,欢迎批评指正!

posted @   郑文亮  阅读(5345)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示