android 图片特效处理之图片叠加

摘要:
如前所述,处理像素点。请参考之前的Android图像处理系列7-图片涂鸦、水印-图片覆盖和Android图像处理序列6-在图片(底部)添加边框-图片覆盖。本文与前一篇略有不同。叠加的原理是,两张图片的像素根据透明度进行叠加,而不进行颜色过滤。叠加图像可以是JPG格式。和以前一样,最好扩大资产目录。

这篇将讲到图片特效处理的图片叠加效果。跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加android图像处理系列之六--给图片添加边框(下)-图片叠加两篇文章,此篇所讲的与之前有一点区别。叠加原理是两张图片的像素点按透明度叠加,不会进行颜色过滤。叠加图片可以是JPG格式,跟前在一样,最好是放大assets目录。下面看效果图:

android 图片特效处理之图片叠加第1张+android 图片特效处理之图片叠加第2张android 图片特效处理之图片叠加第3张

代码:

  1. /** 
  2.      * 图片效果叠加 
  3.      * @param bmp 限制了尺寸大小的Bitmap 
  4.      * @return 
  5.      */  
  6.     private Bitmap overlay(Bitmap bmp)  
  7.     {  
  8.         long start = System.currentTimeMillis();  
  9.         int width = bmp.getWidth();  
  10.         int height = bmp.getHeight();  
  11.         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
  12.           
  13.         // 对边框图片进行缩放  
  14.         Bitmap overlay = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.rainbow_overlay);  
  15.         int w = overlay.getWidth();  
  16.         int h = overlay.getHeight();  
  17.         float scaleX = width * 1F / w;  
  18.         float scaleY = height * 1F / h;  
  19.         Matrix matrix = new Matrix();  
  20.         matrix.postScale(scaleX, scaleY);  
  21.           
  22.         Bitmap overlayCopy = Bitmap.createBitmap(overlay, 0, 0, w, h, matrix, true);  
  23.           
  24.         int pixColor = 0;  
  25.         int layColor = 0;  
  26.           
  27.         int pixR = 0;  
  28.         int pixG = 0;  
  29.         int pixB = 0;  
  30.         int pixA = 0;  
  31.           
  32.         int newR = 0;  
  33.         int newG = 0;  
  34.         int newB = 0;  
  35.         int newA = 0;  
  36.           
  37.         int layR = 0;  
  38.         int layG = 0;  
  39.         int layB = 0;  
  40.         int layA = 0;  
  41.           
  42.         final float alpha = 0.5F;  
  43.           
  44.         int[] srcPixels = new int[width * height];  
  45.         int[] layPixels = new int[width * height];  
  46.         bmp.getPixels(srcPixels, 0, width, 0, 0, width, height);  
  47.         overlayCopy.getPixels(layPixels, 0, width, 0, 0, width, height);  
  48.           
  49.         int pos = 0;  
  50.         for (int i = 0; i < height; i++)  
  51.         {  
  52.             for (int k = 0; k < width; k++)  
  53.             {  
  54.                 pos = i * width + k;  
  55.                 pixColor = srcPixels[pos];  
  56.                 layColor = layPixels[pos];  
  57.                   
  58.                 pixR = Color.red(pixColor);  
  59.                 pixG = Color.green(pixColor);  
  60.                 pixB = Color.blue(pixColor);  
  61.                 pixA = Color.alpha(pixColor);  
  62.                   
  63.                 layR = Color.red(layColor);  
  64.                 layG = Color.green(layColor);  
  65.                 layB = Color.blue(layColor);  
  66.                 layA = Color.alpha(layColor);  
  67.                   
  68.                 newR = (int) (pixR * alpha + layR * (1 - alpha));  
  69.                 newG = (int) (pixG * alpha + layG * (1 - alpha));  
  70.                 newB = (int) (pixB * alpha + layB * (1 - alpha));  
  71.                 layA = (int) (pixA * alpha + layA * (1 - alpha));  
  72.                   
  73.                 newR = Math.min(255, Math.max(0, newR));  
  74.                 newG = Math.min(255, Math.max(0, newG));  
  75.                 newB = Math.min(255, Math.max(0, newB));  
  76.                 newA = Math.min(255, Math.max(0, layA));  
  77.                   
  78.                 srcPixels[pos] = Color.argb(newA, newR, newG, newB);  
  79.             }  
  80.         }  
  81.           
  82.         bitmap.setPixels(srcPixels, 0, width, 0, 0, width, height);  
  83.         long end = System.currentTimeMillis();  
  84.         Log.d("may", "overlayAmeliorate used time="+(end - start));  
  85.         return bitmap;  
  86.     } 


叠加的边框图片还是大点比较好,也要控制被叠加图片大小。alpha变量值可以根据需求修改,建议还是大于0.5比较好,不然原图会看不清楚。

免责声明:文章转载自《android 图片特效处理之图片叠加》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇我的华为面试经历——技术服务物理机与虚拟机IP互ping通,而互ping主机名不通下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

SQL Server中执行正则表达式

如果执行上述函数,将报告以下错误:SQL Server阻塞进程'syssp_可以为OACreate的访问执行以下SQL语句:USEmasterGOsp_configure'showadvancedoptions',1;戈尔配置;GOsp_配置'OleAutomationProcedures',1;戈尔配置;GOsp_配置'AdHocDistributedQu...

Android开发者选项——Gpu呈现模式分析

对于Android用户来说,无论你用的什么品牌的手机,在开发者选项中都能发现“玄学曲线”的开关,之所以称其为玄学曲线,还是因为它被很多网友用于测试一个说不清道不明的东西——流畅度。说到玄学曲线其实它的真名叫做“ProfileGPURendering”,在中文安卓系统下译为“GPU显示配置文件”或“GPU呈现模式分析”等,根据不同厂商定制系统叫法稍有不同。...

arcgispro 计算字段示例

使用两个或四个空格来定义每个逻辑级别。Python计算表达式字段将使用感叹号(。简单计算简单字符串示例一系列Python字符串函数支持使用字符串。字符串字段中的字符可以通过索引和拆分操作访问“”bcd“”Python还支持使用format()方法的字符串格式!)常用Python字符串操作简单数学示例Python提供了处理数字的工具。...

java 服务接口API限流 Rate Limit

服务接口的流量控制策略:分流、降级、流量限制等。2)使用Reids的列表结构,而不是incr命令1FUNCTIONLIMIT_API_CALLL2current=LLEN3IFcurrent˃10THEN4ERROR“toomanyrequestsperssecond”5ELSE6IFEXIST==FALSE7MULTI8RPUSH9EXPIRE10EXEC...

uniapp打包h5 出现'连接服务器超时,点击屏幕重试'的页面

跟踪以首先找出原因全局组件AsyncErrorNew在中注册。js文件可以自定义。我很快就过去了,所以我添加了一个空白页面,然后在清单中介绍了组件。json文件...

sql server 日志软件过大设置办法

在使用sqlserver的过程中,sql日志文件的大小将随着其增长而受到限制。1.找到相应的库--˃属性--˃恢复模式,并将其更改为简单模式。2.选择库--˃任务--˃收缩--˃文件。3.选择日志文件收缩或数据库文件收缩。删除命令后占用的空间将在此处释放。数据库ldf文件的占用空间将更改为设置的空间大小。...