android图像处理系列之六--给图片添加边框(下)-图片叠加

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

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

下面看效果:

+

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

下面贴代码:

[java] view plain copy

  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. Bitmap overlay = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.black);
  13. int w = overlay.getWidth();
  14. int h = overlay.getHeight();
  15. float scaleX = width * 1F / w;
  16. float scaleY = height * 1F / h;
  17. Matrix matrix = new Matrix();
  18. matrix.postScale(scaleX, scaleY);
  19. Bitmap overlayCopy = Bitmap.createBitmap(overlay, 0, 0, w, h, matrix, true);
  20. int pixColor = 0;
  21. int layColor = 0;
  22. int newColor = 0;
  23. int pixR = 0;
  24. int pixG = 0;
  25. int pixB = 0;
  26. int pixA = 0;
  27. int newR = 0;
  28. int newG = 0;
  29. int newB = 0;
  30. int newA = 0;
  31. int layR = 0;
  32. int layG = 0;
  33. int layB = 0;
  34. int layA = 0;
  35. float alpha = 0.3F;
  36. float alphaR = 0F;
  37. float alphaG = 0F;
  38. float alphaB = 0F;
  39. for (int i = 0; i < width; i++)
  40. {
  41. for (int k = 0; k < height; k++)
  42. {
  43. pixColor = bmp.getPixel(i, k);
  44. layColor = overlayCopy.getPixel(i, k);
  45. // 获取原图片的RGBA值
  46. pixR = Color.red(pixColor);
  47. pixG = Color.green(pixColor);
  48. pixB = Color.blue(pixColor);
  49. pixA = Color.alpha(pixColor);
  50. // 获取边框图片的RGBA值
  51. layR = Color.red(layColor);
  52. layG = Color.green(layColor);
  53. layB = Color.blue(layColor);
  54. layA = Color.alpha(layColor);
  55. // 颜色与纯黑色相近的点
  56. if (layR < 20 && layG < 20 && layB < 20)
  57. {
  58. alpha = 1F;
  59. }
  60. else
  61. {
  62. alpha = 0.3F;
  63. }
  64. alphaR = alpha;
  65. alphaG = alpha;
  66. alphaB = alpha;
  67. // 两种颜色叠加
  68. newR = (int) (pixR * alphaR + layR * (1 - alphaR));
  69. newG = (int) (pixG * alphaG + layG * (1 - alphaG));
  70. newB = (int) (pixB * alphaB + layB * (1 - alphaB));
  71. layA = (int) (pixA * alpha + layA * (1 - alpha));
  72. // 值在0~255之间
  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. newColor = Color.argb(newA, newR, newG, newB);
  78. bitmap.setPixel(i, k, newColor);
  79. }
  80. }
  81. return bitmap;
  82. }

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

时间: 2024-08-02 15:14:19

android图像处理系列之六--给图片添加边框(下)-图片叠加的相关文章

android图像处理系列之七--图片涂鸦,水印-图片叠加

图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操作像素点.下面给出别外一种方式让图片叠加--用Canvas处理图片,canvas已经封装好了,直接调用就行. 下面看效果: += 代码: [java] view plain copy /** * 组合涂鸦图片和源图片 * @param src 源图片 * @param watermark 涂鸦图片

android图像处理系列之五--给图片添加边框(中)

前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水平是达不到,不排除牛人,再说了PS那些效果都是程序员做出来,肯定有实现的方法,这可能就要涉及很复杂的图形学.扯远了,接来说怎么用那些精美的花边做为图片的边框.简单的方式是用两张图片叠加.最简单的一种是本文介绍的,用透明的PNG格式图片.因为Android是支持PNG图片处理的,而且PNG图片有透明度

android图像处理系列之四--给图片添加边框(上)

图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路.也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码.下面的代码主要是给出第一种方法,后一种给出代码

android图像处理系列之四-- 给图片添加边框(上)

图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路.也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码.下面的代码主要是给出第一种方法,后一种给出代码

android项目 之 记事本(12) ----- 图片的等比例缩放及给图片添加边框

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中经常会遇到图片的缩放,就比如记事本,现在的图片都比较大,如果将原图不经缩放直接放在屏幕上,则会占满整个屏幕,而且有时图片会比屏幕还大,这时就不能完全的显示整个图片,所以,必须要进行缩放,但在缩放时,该如何缩放呢,长和宽的缩放比例设置为多少合适呢,为了保持原图的纵横比,所以要最好的方法就是约束缩放比例,也就是等比例缩放,相信大家都用过PS中的缩放图片的

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图: 处理后: 下面贴代码: 一.图片处理层: [java] view plaincopy package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android

Android为各种组件或布局添加边框 以xml方式实现

1.在drawable文件夹下新建一个border.xml文件,然后将以下代码粘贴进去,可以根据自己的需要定义不同的颜色边框,或者是只有单边.两边或三边.四边的情况,非常好控制. 2.引用 在你需要使用的组件上或者是Layout布局上以background的方式去引用border.xml就可以了.项目中如果需要多种样式边框,当然你可以将border.xml命名成不同的文件名,然后分别加以引用即可(扯多了,大家都挺牛叉的)! <?xml version="1.0" encoding

android 图像处理系列合集

为了便于大家对滤镜算法的学习,以后发布的图像处理滤镜系列帖子会在这里汇总,本人第一次写合集,写得不好的地方大家请见谅,手头上虽然有一些滤镜的算法,但是大多不是android版的,教程里的代码大多是我借鉴其他语言的算法转换而成的,效率上还存在优化的空间,大家可以自行优化.有些网友说代码能看懂,但是里面的某些数值不知道是怎么计算出来的,说实话有些数值我不查资料我也不是很清楚,但是当我需要知道的时候我也会慢慢查阅算法的核心思想,很多参数由此而来.同时也希望大家养成不懂就查的习惯. android 图像

使用CSS为图片添加边框的几种方法

css的应用十分广泛,即便用在图片的效果中也是方法多样,本文下面就介绍五种为图片添加特殊效果边框的CSS写法阴影效果 通过使用带有一些padding之的背景图来添加阴影效果. HTML <img class=”shadow” src=”sample.jpg” alt=”" /> CSS img.shadow { background: url(shadow-1000×1000.gif) no-repeat right bottom; padding: 5px 10px 10px 5p