【Android图像处理】浮雕滤镜(效果)
2016-11-19 00:07
337 查看
看到雕刻大师的作品是不是很向往呢?
其实不用,完全可以在Android上模拟一下浮雕的滤镜,虽然效果没有大师们的好,但是有着很大程度上的相似。
实现浮雕的原理是用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,因此这样的算法处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,也就是灰色,这样就具有了浮雕效果。
在Android中用代码来实现就是这个样子:
//浮雕
public static Bitmap Carving(Bitmap bm){
int Width = bm.getWidth();
int Height = bm.getHeight();
Bitmap bitmap = Bitmap.createBitmap(Width, Height, Bitmap.Config.ARGB_8888);
int color = 0,colorBefore = 0;
int a,r,g,b;
int r1,g1,b1;
int[] oldPx = new int[Width * Height];
int[] newPx = new int[Width * Height];
bm.getPixels(oldPx, 0, Width, 0, 0, Width, Height);
for(int i = 1; i < Width * Height; i++){
colorBefore = oldPx[i - 1];
a = Color.alpha(colorBefore);
r = Color.red(colorBefore);
g = Color.green(colorBefore);
b = Color.blue(colorBefore);
color = oldPx[i];
r1 = Color.red(color);
g1 = Color.green(color);
b1 = Color.blue(color);
r = (r - r1 + 127);
g = (g - g1 + 127);
b = (b - b1 + 127);
//检查各点像素值是否超出范围
if(r > 255){
r = 255;
}
if(g > 255){
g = 255;
}
if(b > 255){
b = 255;
}
newPx[i] = Color.argb(a, r, g, b);
}
bitmap.setPixels(newPx, 0, Width, 0, 0, Width, Height);
return bitmap;
}
算法中最重要的变化是(当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值)
r = (r - r1 + 127);
g = (g - g1 + 127);
b = (b - b1 + 127);对应的效果如下:
原图如下:
其实不用,完全可以在Android上模拟一下浮雕的滤镜,虽然效果没有大师们的好,但是有着很大程度上的相似。
实现浮雕的原理是用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,因此这样的算法处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,也就是灰色,这样就具有了浮雕效果。
在Android中用代码来实现就是这个样子:
//浮雕
public static Bitmap Carving(Bitmap bm){
int Width = bm.getWidth();
int Height = bm.getHeight();
Bitmap bitmap = Bitmap.createBitmap(Width, Height, Bitmap.Config.ARGB_8888);
int color = 0,colorBefore = 0;
int a,r,g,b;
int r1,g1,b1;
int[] oldPx = new int[Width * Height];
int[] newPx = new int[Width * Height];
bm.getPixels(oldPx, 0, Width, 0, 0, Width, Height);
for(int i = 1; i < Width * Height; i++){
colorBefore = oldPx[i - 1];
a = Color.alpha(colorBefore);
r = Color.red(colorBefore);
g = Color.green(colorBefore);
b = Color.blue(colorBefore);
color = oldPx[i];
r1 = Color.red(color);
g1 = Color.green(color);
b1 = Color.blue(color);
r = (r - r1 + 127);
g = (g - g1 + 127);
b = (b - b1 + 127);
//检查各点像素值是否超出范围
if(r > 255){
r = 255;
}
if(g > 255){
g = 255;
}
if(b > 255){
b = 255;
}
newPx[i] = Color.argb(a, r, g, b);
}
bitmap.setPixels(newPx, 0, Width, 0, 0, Width, Height);
return bitmap;
}
算法中最重要的变化是(当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值)
r = (r - r1 + 127);
g = (g - g1 + 127);
b = (b - b1 + 127);对应的效果如下:
原图如下:
相关文章推荐
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- 黄聪:C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- 黄聪:C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果,滤波,图像截取) 对图片的处理 : 亮度调整 抓屏 翻转 随鼠标画矩形
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- Android图像处理(二)底片效果、怀旧效果、浮雕效果
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- android图像处理(3)浮雕效果
- C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)