android 图片特效处理之 图片叠加
2024-08-31 16:43:23
这篇将讲到图片特效处理的图片叠加效果。跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片叠加两篇文章,此篇所讲的与之前有一点区别。叠加原理是两张图片的像素点按透明度叠加,不会进行颜色过滤。叠加图片可以是JPG格式,跟前在一样,最好是放大assets目录。下面看效果图:
+=
代码:
- /**
- * 图片效果叠加
- * @param bmp 限制了尺寸大小的Bitmap
- * @return
- */
- private Bitmap overlay(Bitmap bmp)
- {
- long start = System.currentTimeMillis();
- int width = bmp.getWidth();
- int height = bmp.getHeight();
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
- // 对边框图片进行缩放
- Bitmap overlay = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.rainbow_overlay);
- int w = overlay.getWidth();
- int h = overlay.getHeight();
- float scaleX = width * 1F / w;
- float scaleY = height * 1F / h;
- Matrix matrix = new Matrix();
- matrix.postScale(scaleX, scaleY);
- Bitmap overlayCopy = Bitmap.createBitmap(overlay, 0, 0, w, h, matrix, true);
- int pixColor = 0;
- int layColor = 0;
- int pixR = 0;
- int pixG = 0;
- int pixB = 0;
- int pixA = 0;
- int newR = 0;
- int newG = 0;
- int newB = 0;
- int newA = 0;
- int layR = 0;
- int layG = 0;
- int layB = 0;
- int layA = 0;
- final float alpha = 0.5F;
- int[] srcPixels = new int[width * height];
- int[] layPixels = new int[width * height];
- bmp.getPixels(srcPixels, 0, width, 0, 0, width, height);
- overlayCopy.getPixels(layPixels, 0, width, 0, 0, width, height);
- int pos = 0;
- for (int i = 0; i < height; i++)
- {
- for (int k = 0; k < width; k++)
- {
- pos = i * width + k;
- pixColor = srcPixels[pos];
- layColor = layPixels[pos];
- pixR = Color.red(pixColor);
- pixG = Color.green(pixColor);
- pixB = Color.blue(pixColor);
- pixA = Color.alpha(pixColor);
- layR = Color.red(layColor);
- layG = Color.green(layColor);
- layB = Color.blue(layColor);
- layA = Color.alpha(layColor);
- newR = (int) (pixR * alpha + layR * (1 - alpha));
- newG = (int) (pixG * alpha + layG * (1 - alpha));
- newB = (int) (pixB * alpha + layB * (1 - alpha));
- layA = (int) (pixA * alpha + layA * (1 - alpha));
- newR = Math.min(255, Math.max(0, newR));
- newG = Math.min(255, Math.max(0, newG));
- newB = Math.min(255, Math.max(0, newB));
- newA = Math.min(255, Math.max(0, layA));
- srcPixels[pos] = Color.argb(newA, newR, newG, newB);
- }
- }
- bitmap.setPixels(srcPixels, 0, width, 0, 0, width, height);
- long end = System.currentTimeMillis();
- Log.d("may", "overlayAmeliorate used time="+(end - start));
- return bitmap;
- }
叠加的边框图片还是大点比较好,也要控制被叠加图片大小。alpha变量值可以根据需求修改,建议还是大于0.5比较好,不然原图会看不清楚。
最新文章
- windows 7(32/64位)GHO安装指南(U盘引导篇)~
- Jquery制作--美化下拉框
- CSS三种写法的优先级
- sqlHelper做增删改查
- Get the Uniqueid of Action Originate in the AMI
- 最短路径—Dijkstra算法
- JavaWeb学习记录(十九)——jstl自定义标签之简单标签
- 【LeetCode】17. Letter Combinations of a Phone Number
- CoreData的简单使用(一)数据库的创建
- FACL的使用
- 2015第37周五javascript函数arguments对象巧用一
- Putty以及adb网络调试
- java中关于编码的问题(字符转换流及字符缓冲流 )
- 理解JDK1.5的自动装箱拆箱
- R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列深度学习检测方法梳理
- Python 使用 xlwings 往 excel 中写入一行数据的两种方法
- 利用mycat实现基于mysql5.5主从复制的读写分离
- Computer Study
- NodeJS框架express的路径映射(路由)功能及控制
- ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数