现在的位置: 首页 > 综合 > 正文

关于android系统图像特效处理之光照效果

2013年09月21日 ⁄ 综合 ⁄ 共 1371字 ⁄ 字号 评论关闭

本人做了一个图片浏览器,用了一些图像处理的算法,这个是一部分,APK安装包地址:http://static.apk.hiapk.com/html/2012/08/797656.html,欢迎下载和反馈;

关于android系统图像特效处理之光照效果

public static Bitmap sunshine(SoftReference<Bitmap> bmp)  
    {  	
		
        final int width = bmp.get().getWidth();  
        final int height = bmp.get().getHeight();  
        Log.d("sunshine", "sunshine:width"+width+"height:"+height);
        Bitmap bitmap = (Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565));  
          
        int pixR = 0;  
        int pixG = 0;  
        int pixB = 0;  
          
        int pixColor = 0;  
          
        int newR = 0;  
        int newG = 0;  
        int newB = 0;  
          
        int centerX = width / 2;  
        int centerY = height / 2;  
        int radius = Math.min(centerX, centerY);  
          
        final float strength = 150F; // 光照强度 100~150  
        int[] pixels = new int[width * height];  
        bmp.get().getPixels(pixels, 0, width, 0, 0, width, height);  
        int pos = 0;  
        
//        bmp.recycle();
//        bmp = null;
        for (int i = 1, length = height - 1; i < length; i++)  
        {  
            for (int k = 1, len = width - 1; k < len; k++)  
            {  
            	
                pos = i * width + k;  
                pixColor = pixels[pos];  
                  
                pixR = Color.red(pixColor);  
                pixG = Color.green(pixColor);  
                pixB = Color.blue(pixColor);  
                  
                newR = pixR;  
                newG = pixG;  
                newB = pixB;  
                  
                // 计算当前点到光照中心的距离,平面座标系中求两点之间的距离  v 
                int distance = (int) (Math.pow((centerY - i), 2) + Math.pow(centerX - k, 2));  
                if (distance < radius * radius)  
                {  
                    // 按照距离大小计算增加的光照值  
                    int result = (int) (strength * (1.0 - Math.sqrt(distance) / radius));  
                    newR = pixR + result;  
                    newG = pixG + result;  
                    newB = pixB + result;  
                }  
                  
                newR = Math.min(255, Math.max(0, newR));  
                newG = Math.min(255, Math.max(0, newG));  
                newB = Math.min(255, Math.max(0, newB));  
                  
                pixels[pos] = Color.argb(255, newR, newG, newB);  
            }  
        }  
        
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);  
        return bitmap;  
    }

 

抱歉!评论已关闭.