• Android 给图片加边框


    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法。

    基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路。也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码。下面的代码主要是给出第一种方法,后一种给出代码,有兴趣的可以自己试试。注意图片不要放到drawable目录下面,因为屏幕分辨率会影响图片的大小,所以最好是放在assets目录里面。下面代码为了简便所以没有那样做。后面一篇还会讲到另一种添加边框图片的方法。

    下面贴图片:

    原图片:


    处理后:


    代码(res参数为上面所说的八个边框组合图片资源):

    1. /** 
    2.      * 图片与边框组合 
    3.      * @param bm 原图片 
    4.      * @param res 边框资源 
    5.      * @return 
    6.      */  
    7.     private Bitmap combinateFrame(Bitmap bm, int[] res)  
    8.     {  
    9.         Bitmap bmp = decodeBitmap(res[0]);  
    10.         // 边框的宽高  
    11.         final int smallW = bmp.getWidth();  
    12.         final int smallH = bmp.getHeight();  
    13.           
    14.         // 原图片的宽高  
    15.         final int bigW = bm.getWidth();  
    16.         final int bigH = bm.getHeight();  
    17.           
    18.         int wCount = (int) Math.ceil(bigW * 1.0 / smallW);  
    19.         int hCount = (int) Math.ceil(bigH  * 1.0 / smallH);  
    20.           
    21.         // 组合后图片的宽高  
    22.         int newW = (wCount + 2) * smallW;  
    23.         int newH = (hCount + 2) * smallH;  
    24.           
    25.         // 重新定义大小  
    26.         Bitmap newBitmap = Bitmap.createBitmap(newW, newH, Config.ARGB_8888);  
    27.         Canvas canvas = new Canvas(newBitmap);  
    28.         Paint p = new Paint();  
    29.         p.setColor(Color.TRANSPARENT);  
    30.         canvas.drawRect(new Rect(0, 0, newW, newH), p);  
    31.           
    32.         Rect rect = new Rect(smallW, smallH, newW - smallW, newH - smallH);  
    33.         Paint paint = new Paint();  
    34.         paint.setColor(Color.WHITE);  
    35.         canvas.drawRect(rect, paint);  
    36.           
    37.         // 绘原图  
    38.         canvas.drawBitmap(bm, (newW - bigW - 2 * smallW) / 2 + smallW, (newH - bigH - 2 * smallH) / 2 + smallH, null);  
    39.         // 绘边框  
    40.         // 绘四个角  
    41.         int startW = newW - smallW;  
    42.         int startH = newH - smallH;  
    43.         Bitmap leftTopBm = decodeBitmap(res[0]); // 左上角  
    44.         Bitmap leftBottomBm = decodeBitmap(res[2]); // 左下角  
    45.         Bitmap rightBottomBm = decodeBitmap(res[4]); // 右下角  
    46.         Bitmap rightTopBm = decodeBitmap(res[6]); // 右上角  
    47.           
    48.         canvas.drawBitmap(leftTopBm, 0, 0, null);  
    49.         canvas.drawBitmap(leftBottomBm, 0, startH, null);  
    50.         canvas.drawBitmap(rightBottomBm, startW, startH, null);  
    51.         canvas.drawBitmap(rightTopBm, startW, 0, null);  
    52.           
    53.         leftTopBm.recycle();  
    54.         leftTopBm = null;  
    55.         leftBottomBm.recycle();  
    56.         leftBottomBm = null;  
    57.         rightBottomBm.recycle();  
    58.         rightBottomBm = null;  
    59.         rightTopBm.recycle();  
    60.         rightTopBm = null;  
    61.           
    62.         // 绘左右边框  
    63.         Bitmap leftBm = decodeBitmap(res[1]);  
    64.         Bitmap rightBm = decodeBitmap(res[5]);  
    65.         for (int i = 0, length = hCount; i < length; i++)  
    66.         {  
    67.             int h = smallH * (i + 1);  
    68.             canvas.drawBitmap(leftBm, 0, h, null);  
    69.             canvas.drawBitmap(rightBm, startW, h, null);  
    70.         }  
    71.           
    72.         leftBm.recycle();  
    73.         leftBm = null;  
    74.         rightBm.recycle();  
    75.         rightBm = null;  
    76.           
    77.         // 绘上下边框  
    78.         Bitmap bottomBm = decodeBitmap(res[3]);  
    79.         Bitmap topBm = decodeBitmap(res[7]);  
    80.         for (int i = 0, length = wCount; i < length; i++)  
    81.         {  
    82.             int w = smallW * (i + 1);  
    83.             canvas.drawBitmap(bottomBm, w, startH, null);  
    84.             canvas.drawBitmap(topBm, w, 0, null);  
    85.         }  
    86.           
    87.         bottomBm.recycle();  
    88.         bottomBm = null;  
    89.         topBm.recycle();  
    90.         topBm = null;  
    91.           
    92.         canvas.save(Canvas.ALL_SAVE_FLAG);  
    93.         canvas.restore();  
    94.           
    95.         return newBitmap;  
    96.     }  


    如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。

    1. /** 
    2.  * 截取图片的中间的200X200的区域 
    3.  * @param bm 
    4.  * @return 
    5.  */  
    6. private Bitmap cropCenter(Bitmap bm)  
    7. {  
    8.     int dstWidth = 200;  
    9.        int dstHeight = 200;  
    10.        int startWidth = (bm.getWidth() - dstWidth)/2;  
    11.        int startHeight = ((bm.getHeight() - dstHeight) / 2);  
    12.        Rect src = new Rect(startWidth, startHeight, startWidth + dstWidth, startHeight + dstHeight);  
    13.        return dividePart(bm, src);  
    14. }  
    15.   
    16. /** 
    17.  * 剪切图片 
    18.  * @param bmp 被剪切的图片 
    19.  * @param src 剪切的位置 
    20.  * @return 剪切后的图片 
    21.  */  
    22. private Bitmap dividePart(Bitmap bmp, Rect src)  
    23. {  
    24.     int width = src.width();  
    25.     int height = src.height();  
    26.     Rect des = new Rect(0, 0, width, height);  
    27.     Bitmap croppedImage = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
    28.     Canvas canvas = new Canvas(croppedImage);  
    29.     canvas.drawBitmap(bmp, src, des, null);  
    30.     return croppedImage;  
    31. }  

    处理后图片(原图片还是上面的图片):

  • 相关阅读:
    Wiki上的C++哲学
    UC网盘被关停 将与阿里淘盘合并?(案例说明云盘的成本才是重点,技术不是问题;与巨头竞争是重点)
    又一个!迅雷快盘宣布关闭个人存储服务
    QT运行cmd指令(两种办法:QProcess.start然后waitForFinished,运行cmd /c命令)
    EventBus实现
    彻底抛弃PeopleEditor,SharePoint中利用Jquery Chosen创建新的人员选择器
    软件用了那些技术2
    软件的模块化开发
    在C#中模拟Javascript的setTimeout方法
    IP:网际协议
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6722064.html
Copyright © 2020-2023  润新知