zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android 图片特效处理之光晕效果

Android 处理 图片 效果 特效
2023-09-11 14:17:58 时间

这篇将讲到图片特效处理的图片光晕效果。跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果android图像处理系列之十三--图片特效处理之六-光照效果。实现的效果是圆圈之内图片像素点不变,圆圈之外的点做模糊处理。所以用到了模糊效果和光照效果里面的是否是在圆圈内的算法,可以说是上面提到的两篇的效果的组合。

下面看效果图:

原图:


效果图:


光晕效果看得不是很明显,模糊强度不够,但是还能明显看到图片中有一个圆圈,圈内区域要比圈外区域看得清楚一点(MM的左右脸就可以看到效果)。处理效果不是很理想,在此只能抛砖引玉。下面贴代码:

 

    1. /** 
    2.      * 光晕效果 
    3.      * @param bmp 
    4.      * @param x 光晕中心点在bmp中的x坐标 
    5.      * @param y 光晕中心点在bmp中的y坐标 
    6.      * @param r 光晕的半径 
    7.      * @return 
    8.      */  
    9.     public Bitmap halo(Bitmap bmp, int x, int y, float r)  
    10.     {  
    11.         long start = System.currentTimeMillis();  
    12.         // 高斯矩阵  
    13.         int[] gauss = new int[] { 1, 2, 1, 2, 4, 2, 1, 2, 1 };  
    14.           
    15.         int width = bmp.getWidth();  
    16.         int height = bmp.getHeight();  
    17.         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
    18.           
    19.         int pixR = 0;  
    20.         int pixG = 0;  
    21.         int pixB = 0;  
    22.           
    23.         int pixColor = 0;  
    24.           
    25.         int newR = 0;  
    26.         int newG = 0;  
    27.         int newB = 0;  
    28.           
    29.         int delta = 18; // 值越小图片会越亮,越大则越暗  
    30.           
    31.         int idx = 0;  
    32.         int[] pixels = new int[width * height];  
    33.         bmp.getPixels(pixels, 0, width, 0, 0, width, height);  
    34.         for (int i = 1, length = height - 1; i < length; i++)  
    35.         {  
    36.             for (int k = 1, len = width - 1; k < len; k++)  
    37.             {  
    38.                 idx = 0;  
    39.                 int distance = (int) (Math.pow(k - x, 2) + Math.pow(i - y, 2));  
    40.                 // 不是中心区域的点做模糊处理  
    41.                 if (distance > r * r)  
    42.                 {  
    43.                     for (int m = -1; m <= 1; m++)  
    44.                     {  
    45.                         for (int n = -1; n <= 1; n++)  
    46.                         {  
    47.                             pixColor = pixels[(i + m) * width + k + n];  
    48.                             pixR = Color.red(pixColor);  
    49.                             pixG = Color.green(pixColor);  
    50.                             pixB = Color.blue(pixColor);  
    51.                               
    52.                             newR = newR + (int) (pixR * gauss[idx]);  
    53.                             newG = newG + (int) (pixG * gauss[idx]);  
    54.                             newB = newB + (int) (pixB * gauss[idx]);  
    55.                             idx++;  
    56.                         }  
    57.                     }  
    58.                       
    59.                     newR /= delta;  
    60.                     newG /= delta;  
    61.                     newB /= delta;  
    62.                       
    63.                     newR = Math.min(255, Math.max(0, newR));  
    64.                     newG = Math.min(255, Math.max(0, newG));  
    65.                     newB = Math.min(255, Math.max(0, newB));  
    66.                       
    67.                     pixels[i * width + k] = Color.argb(255, newR, newG, newB);  
    68.                       
    69.                     newR = 0;  
    70.                     newG = 0;  
    71.                     newB = 0;  
    72.                 }  
    73.             }  
    74.         }  
    75.           
    76.         bitmap.setPixels(pixels, 0, width, 0, 0, width, height);  
    77.         long end = System.currentTimeMillis();  
    78.         Log.d("may", "used time="+(end - start));  
    79.         return bitmap;  
    80.     }