Android修改图片颜色-转成灰度图

项目中的一个需求,优惠券页面,过期的优惠券需要显示成黑白图片,灰度图,后台不给配黑白图片,只能在客户端处理了,先看效果图:
在这里插入图片描述
在这里插入图片描述
图片加载我用的是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";
    }
}
  1. 使用GreyPicTransform
Glide.with(context)
                    .load("http://your image url...")
                    .bitmapTransform(new GreyPicTransform(context))
                    .into(imageView);
package com.tongtong.feat_watch.utils;

import static android.os.Build.ID;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;


/**
 * @author: shuhuai
 * @desc:
 * @date: 2024/11/28
 * @version:
 * @remark
 */
public class GreyPicTransform extends BitmapTransformation {

    private static float radius = 12f;
    private static final byte[] ID_BYTES = ID.getBytes(StandardCharsets.UTF_8);

    public GreyPicTransform(Context context) {
        this(context, 12);
    }

    public GreyPicTransform(Context context, int dp) {
        super();
        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return convertGreyImg(toTransform);
    }

    public String getId() {
        return getClass().getName() + Math.round(radius);
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {
        messageDigest.update(ID_BYTES);
    }


    /**
     * 彩图转换成灰色图片
     *
     * @param img
     * @return
     */
    private 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;
    }

}

   fun setImageGrey(context: Context?, view: ImageView, url: String?) {
        val transformations: MutableList<Transformation<Bitmap>> = mutableListOf()
        transformations.add(GreyPicTransform(context))
        if (transformations.isNotEmpty()) {
            options.transform(MultiTransformation(transformations))
        }
        context?.let {
            Glide.with(it).load(url)
                .apply(options)
                .into(view)
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值