您的位置:首页 > 移动开发 > Android开发

【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;
}
通过代码可以看到算法中并没有涉及到复杂的计算,只是将纹理图缩放后的矩阵和原图的矩阵各取一半放结果图的矩阵中,其实该比例是可以自己调整的。
由于这里还没有介绍到油画算法,因此效果先不做演示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐