android图片特效处理之图片叠加

家资是何物,积帙列梁梠。这篇文章主要讲述android图片特效处理之图片叠加相关的知识,希望能为你提供帮助。
这篇将讲到图片特效处理的图片叠加效果。跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片叠加两篇文章,此篇所讲的与之前有一点区别。叠加原理是两张图片的像素点按透明度叠加,不会进行颜色过滤。叠加图片可以是JPG格式,跟前在一样,最好是放大assets目录。下面看效果图:

android图片特效处理之图片叠加

文章图片
+
android图片特效处理之图片叠加

文章图片
android图片特效处理之图片叠加

文章图片

代码:
[java] view plain copy
  1. /** 
  2.           *  图片效果叠加 
  3.           *  @param  bmp  限制了尺寸大小的Bitmap 
  4.           *  @return 
  5.           */   
  6.         private  Bitmap  overlay(Bitmap  bmp)   
  7.         {   
  8.                 long  start  =  System.currentTimeMillis();    
  9.                 int  width  =  bmp.getWidth();    
  10.                 int  height  =  bmp.getHeight();    
  11.                 Bitmap  bitmap  =  Bitmap.createBitmap(width,  height,  Bitmap.Config.RGB_565);    
  12.                    
  13.                 //  对边框图片进行缩放   
  14.                 Bitmap  overlay  =  BitmapFactory.decodeResource(mContext.getResources(),  R.drawable.rainbow_overlay);    
  15.                 int  w  =  overlay.getWidth();    
  16.                 int  h  =  overlay.getHeight();    
  17.                 float  scaleX  =  width  *  1F  /  w;    
  18.                 float  scaleY  =  height  *  1F  /  h;    
  19.                 Matrix  matrix  =  new  Matrix();    
  20.                 matrix.postScale(scaleX,  scaleY);    
  21.                    
  22.                 Bitmap  overlayCopy  =  Bitmap.createBitmap(overlay,  0,  0,  w,  h,  matrix,  true);    
  23.                    
  24.                 int  pixColor  =  0;    
  25.                 int  layColor  =  0;    
  26.                    
  27.                 int  pixR  =  0;    
  28.                 int  pixG  =  0;    
  29.                 int  pixB  =  0;    
  30.                 int  pixA  =  0;    
  31.                    
  32.                 int  newR  =  0;    
  33.                 int  newG  =  0;    
  34.                 int  newB  =  0;    
  35.                 int  newA  =  0;    
  36.                    
  37.                 int  layR  =  0;    
  38.                 int  layG  =  0;    
  39.                 int  layB  =  0;    
  40.                 int  layA  =  0;    
  41.                    
  42.                 final  float  alpha  =  0.5F;    
  43.                    
  44.                 int[]  srcPixels  =  new  int[width  *  height];    
  45.                 int[]  layPixels  =  new  int[width  *  height];    
  46.                 bmp.getPixels(srcPixels,  0,  width,  0,  0,  width,  height);    
  47.                 overlayCopy.getPixels(layPixels,  0,  width,  0,  0,  width,  height);    
  48.                    
  49.                 int  pos  =  0;    
  50.                 for  (int  i  =  0;   i  <   height;   i++)   
  51.                 {   
  52.                         for  (int  k  =  0;   k  <   width;   k++)   
  53.                         {   
  54.                                 pos  =  i  *  width  +  k;    
  55.                                 pixColor  =  srcPixels[pos];    
  56.                                 layColor  =  layPixels[pos];    
  57.                                    
  58.                                 pixR  =  Color.red(pixColor);    
  59.                                 pixG  =  Color.green(pixColor);    
  60.                                 pixB  =  Color.blue(pixColor);    
  61.                                 pixA  =  Color.alpha(pixColor);    
  62.                                    
  63.                                 layR  =  Color.red(layColor);    
  64.                                 layG  =  Color.green(layColor);    
  65.                                 layB  =  Color.blue(layColor);    
  66.                                 layA  =  Color.alpha(layColor);    
  67.                                    
  68.                                 newR  =  (int)  (pixR  *  alpha  +  layR  *  (1  -  alpha));    
  69.                                 newG  =  (int)  (pixG  *  alpha  +  layG  *  (1  -  alpha));    
  70.                                 newB  =  (int)  (pixB  *  alpha  +  layB  *  (1  -  alpha));    
  71.                                 layA  =  (int)  (pixA  *  alpha  +  layA  *  (1  -  alpha));    
  72.                                    
  73.                                 newR  =  Math.min(255,  Math.max(0,  newR));    
  74.                                 newG  =  Math.min(255,  Math.max(0,  newG));    
  75.                                 newB  =  Math.min(255,  Math.max(0,  newB));    
  76.                                 newA  =  Math.min(255,  Math.max(0,  layA));    
  77.                                    
  78.                                 srcPixels[pos]  =  Color.argb(newA,  newR,  newG,  newB);    
  79.                         }   
  80.                 }   
  81.                    
  82.                 bitmap.setPixels(srcPixels,  0,  width,  0,  0,  width,  height);    
  83.                 long  end  =  System.currentTimeMillis();    
  84.                 Log.d("may",  "overlayAmeliorate  used  time="+(end  -  start));    
  85.                 return  bitmap;    
  86.         } 
【android图片特效处理之图片叠加】
叠加的边框图片还是大点比较好,也要控制被叠加图片大小。alpha变量值可以根据需求修改,建议还是大于0.5比较好,不然原图会看不清楚。


    推荐阅读