项目中的一个需求,优惠券页面,过期的优惠券需要显示成黑白图片,灰度图,后台不给配黑白图片,只能在客户端处理了,先看效果图:
Android修改图片颜色-转成灰度图_第1张图片

Android修改图片颜色-转成灰度图_第2张图片

图片加载我用的是Glide,稍后我会贴出如何结合Glide来转成灰度图,下面是工具类代码:

    /**     * 彩图转换成灰色图片     *     * @param img     * @return     */    public static Bitmap convertGreyImg(Bitmap img) {        int width = img.getWidth();         //获取位图的宽        int height = img.getHeight();       //获取位图的高        int[] pixels = new int[width * height]; //通过位图的大小创建像素点数组        img.getPixels(pixels, 0, width, 0, 0, width, height);        int alpha = 0xFF << 24;        for (int i = 0; i < height; i++) {            for (int j = 0; j < width; j++) {                int grey;                if (pixels[width * i + j] == 0) {                    continue;                } else grey = pixels[width * i + j];                int red = ((grey & 0x00FF0000) >> 16);                int green = ((grey & 0x0000FF00) >> 8);                int blue = (grey & 0x000000FF);                grey = (int) ((float) red * 0.44 + (float) green * 0.45 + (float) blue * 0.11);                grey = alpha | (grey << 16) | (grey << 8) | grey;                pixels[width * i + j] = grey;            }        }        //创建空的bitmap时,格式一定要选择ARGB_4444,或ARGB_8888,代表有Alpha通道,RGB_565格式的不显示灰度        Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);        result.setPixels(pixels, 0, width, 0, 0, width, height);        return result;    }

这个方法的原理就是,根据图片的大小,循环取出图片每个像素点的信息,然后修改每个像素点的Alpha,Red,Green,Blue,四个通道的色值,再创建一个与原图片同样大小的Bitmap对象,把修改过的像素点都设置给它,从而达到转成灰度图的目的,要注意 ,原图片并未修改,而是取出原图的pixcel设置给新图。

下面结合Glide,讲一下如何实际使用这个工具类,用过Glide的朋友都知道,Glide加载图片过程中有一个BitmapTransformation,这个抽象类里面的transform方法,参数里包含了从网上加载bitmap类型的原图,我们可以从这个方法入手:

1. 自定义类继承BitmapTransformation

/** * Glide 将下载到的图片转成灰色图片 * * Created by bayin on 2017/2/16. */public class GreyPicTransform extends BitmapTransformation {    public GreyPicTransform(Context context) {        super(context);    }    @Override    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {    //这里就是上面我们写的工具类方法        return ImageUtils.convertGreyImg(toTransform);    }    @Override    public String getId() {    //返回string就行,Glide加载图片的tag,一定要复写这个方法,并有返回值        return "grey";    }}

2. 使用GreyPicTransform

Glide.with(context)                    .load("http://your image url...")                    .bitmapTransform(new GreyPicTransform(context))                    .into(imageView);

OK~,就是这么简单,赶紧试一试吧,如有错误之处请告知,多多交流~

更多相关文章

  1. Android ImageView设置长度高度为wrap_content时高度根据图片比
  2. Android实现获取本机中所有图片
  3. Android中实现网络图片的获取
  4. AsyncTask异步下载图片
  5. Android图片加载框架Picasso最全使用教程 一
  6. android checkbox 未选中状态 已选中状态 替换成自己的图片

随机推荐

  1. Android 远程调试 JNI 实现
  2. WebView及js
  3. Java简单模拟Android中Handler-Message机
  4. android限制输入框长度与限制输入数字
  5. Android View的属性
  6. android 绿色开发环境
  7. [Android Pro] 完美Android Cursor使用例
  8. Android:通过Camera进行拍照
  9. Android知识点记录:七牛Android(安卓)SDK
  10. 在CentOS下搭建Android 开发环境