zoukankan      html  css  js  c++  java
  • android图像处理系列之六-- 给图片添加边框(下)-图片叠加

    前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式。前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以忽略包的大小,那么可以用前种处理方式,本文讲到的虽然可以减小图片的体积,但处理较复杂,而且本人研究的还不是很成熟。本文就是针对JPG边框处理,但缺点是还不够成熟,仅提供思路。

    思路:可以将边框做成JPG图片,没有边框的地方,一般都是中间区域调成特殊颜色,比如黑色。在两张图片叠加的时候,对边框图片做特殊处理,比如是黑色的点过滤掉,改变边框图片像素点的透明度,即可完成前面PNG图片的效果。

    下面看效果:

    +

    目前代码处理的还不是很好,非黑色点与黑色点的交界处没有做模糊处理,具体方法后面的文章会讲到。一样的边框图片建议放在assets目录。

    下面贴代码:

    1. <pre name="code" class="java">/** 
    2.      * 叠加边框图片有用部分 
    3.      * @param bmp 
    4.      * @return 
    5.      */  
    6.     private Bitmap alphaLayer(Bitmap bmp)  
    7.     {  
    8.         int width = bmp.getWidth();  
    9.         int height = bmp.getHeight();  
    10.         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
    11.           
    12.         // 边框图片  
    13.         Bitmap overlay = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.black);  
    14.         int w = overlay.getWidth();  
    15.         int h = overlay.getHeight();  
    16.         float scaleX = width * 1F / w;  
    17.         float scaleY = height * 1F / h;  
    18.         Matrix matrix = new Matrix();  
    19.         matrix.postScale(scaleX, scaleY);  
    20.           
    21.         Bitmap overlayCopy = Bitmap.createBitmap(overlay, 0, 0, w, h, matrix, true);  
    22.           
    23.         int pixColor = 0;  
    24.         int layColor = 0;  
    25.         int newColor = 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.         float alpha = 0.3F;  
    43.         float alphaR = 0F;  
    44.         float alphaG = 0F;  
    45.         float alphaB = 0F;  
    46.         for (int i = 0; i < width; i++)  
    47.         {  
    48.             for (int k = 0; k < height; k++)  
    49.             {  
    50.                 pixColor = bmp.getPixel(i, k);  
    51.                 layColor = overlayCopy.getPixel(i, k);  
    52.                   
    53.                 // 获取原图片的RGBA值  
    54.                 pixR = Color.red(pixColor);  
    55.                 pixG = Color.green(pixColor);  
    56.                 pixB = Color.blue(pixColor);  
    57.                 pixA = Color.alpha(pixColor);  
    58.                   
    59.                 // 获取边框图片的RGBA值  
    60.                 layR = Color.red(layColor);  
    61.                 layG = Color.green(layColor);  
    62.                 layB = Color.blue(layColor);  
    63.                 layA = Color.alpha(layColor);  
    64.                   
    65.                 // 颜色与纯黑色相近的点  
    66.                 if (layR < 20 && layG < 20 && layB < 20)  
    67.                 {  
    68.                     alpha = 1F;  
    69.                 }  
    70.                 else  
    71.                 {  
    72.                     alpha = 0.3F;  
    73.                 }  
    74.                   
    75.                 alphaR = alpha;  
    76.                 alphaG = alpha;  
    77.                 alphaB = alpha;  
    78.                   
    79.                 // 两种颜色叠加  
    80.                 newR = (int) (pixR * alphaR + layR * (1 - alphaR));  
    81.                 newG = (int) (pixG * alphaG + layG * (1 - alphaG));  
    82.                 newB = (int) (pixB * alphaB + layB * (1 - alphaB));  
    83.                 layA = (int) (pixA * alpha + layA * (1 - alpha));  
    84.                   
    85.                 // 值在0~255之间  
    86.                 newR = Math.min(255, Math.max(0, newR));  
    87.                 newG = Math.min(255, Math.max(0, newG));  
    88.                 newB = Math.min(255, Math.max(0, newB));  
    89.                 newA = Math.min(255, Math.max(0, layA));  
    90.                   
    91.                 newColor = Color.argb(newA, newR, newG, newB);  
    92.                 bitmap.setPixel(i, k, newColor);  
    93.             }  
    94.         }  
    95.           
    96.           
    97.         return bitmap;  
    98.     }  


     

    这种方式图片处理比较慢,因为像素点要一个个getPixel(),组成新图片的时候要一个个setPixel()。另外可以用getPixels(),和setPixels()方法,这种处理要快一点,本人对其它类似效果的处理测试了一下,后面处理方式要比前面快3多倍。因为这种图片叠加是对像素点处理,是后面的特效处理系列,因为涉及到图片叠加,所以放到前面来。具体怎么使用,后面也会很快讨论到,读者也可以自己研究。优化的代码会在后面贴出来,敬请期待。

     
  • 相关阅读:
    一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介
    常用perl脚本工具
    一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的"my-boot"
    一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)
    一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“精简版”)
    perl的正则表达式
    vim小技巧
    一些方便的bash命令
    Linux磁盘及文件系统管理
    Linux权限扩展
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6722582.html
Copyright © 2011-2022 走看看