【Android图像处理】图片叠加/给图片添加纹理
2016-11-22 20:54
1286 查看
注:本算法非博主原创,由于时间比较久已经不知道出自何处,侵权则删。
在做图像处理的时候,给图片添加纹理是必须也是必要的,特别是油画,铅笔画...这类的非真实感绘制的算法。添加纹理和不添加纹理的效果对比是十分明显的。
下面即为图片叠加算法:
/**
* 给图片添加纹理
* @param bmp 原图
* @param overlay 纹理图
* @return
*/
public static Bitmap Overlay(Bitmap bmp, Bitmap overlay) {
int width = bmp.getWidth();
int height = bmp.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
// 对边框图片进行缩放
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);
return bitmap;
}
通过代码可以看到算法中并没有涉及到复杂的计算,只是将纹理图缩放后的矩阵和原图的矩阵各取一半放结果图的矩阵中,其实该比例是可以自己调整的。
由于这里还没有介绍到油画算法,因此效果先不做演示。
在做图像处理的时候,给图片添加纹理是必须也是必要的,特别是油画,铅笔画...这类的非真实感绘制的算法。添加纹理和不添加纹理的效果对比是十分明显的。
下面即为图片叠加算法:
/**
* 给图片添加纹理
* @param bmp 原图
* @param overlay 纹理图
* @return
*/
public static Bitmap Overlay(Bitmap bmp, Bitmap overlay) {
int width = bmp.getWidth();
int height = bmp.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
// 对边框图片进行缩放
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);
return bitmap;
}
通过代码可以看到算法中并没有涉及到复杂的计算,只是将纹理图缩放后的矩阵和原图的矩阵各取一半放结果图的矩阵中,其实该比例是可以自己调整的。
由于这里还没有介绍到油画算法,因此效果先不做演示。
相关文章推荐
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
- android图像处理系列之六--给图片添加边框(下)-图片叠加
- Android图像处理之Bitmap 生成图片 解析 保存文件 获取 问题
- android中Bitmap图像处理 修改图片大小以及保存时的文件大小
- 【Android开发】图形图像处理技术-绘制图片
- android中的图形图像处理-如访问图片drawable
- Android图片特效处理之图片叠加
- android图片特效处理之图片叠加
- Android图片处理:识别图像方向并显示
- android图片特效处理之图片叠加
- android中Bitmap图像处理 修改图片大小以及保存时的文件大小
- Android 图片旋转,缩放,切割,叠加处理
- 图像处理之图像纹理添加效果(利用JAVA 2D纹理画笔)
- [Android] 给图像添加相框、圆形圆角显示图片、图像合成知识
- php图像处理类,上传,压缩,添加文字、图片水印
- 原创 ···DELPHI 图片图形图像处理 PS置换滤镜效果,亮度/对比度,纹理贴图效果
- Android图片处理:识别图像方向并显示
- 转《[图像处理/特效] android 用LruCache读取大图片并缓存》
- Android图片高斯模糊处理应用-涉及libjpeg的使用,NDK对SurfaceView的操作,图像模糊处理,附源代码