Java自己编写的 提取图片颜色组成百分比

支持技术分享,转载或复制,请指出文章来源此博客作者为Jack__0023

1、背景

最近比较悠闲一点,然后就在考虑,我应该如何识别我们公司的终端是不是黑屏了,如果我能识别了,这样的话,运维的工作就可以变的简单一点,所以有了这个东西的产生。 bak:只能说满足我的需求,你们可以参考一下

2、简介和代码区

2-1、简介区域
2-1-1、没有什么很复杂的类,基本我都封好了,支持资源文件夹,sd卡这些的图片进行颜色提取,可能比较有争议的是我自己编写的颜色区分类(MyColor 类),因为是我自己慢慢去测试训练的,所以这个一定不是非常准确的,会存在我划分出来的颜色值,只能说是一个大概的范围判断。
2-2、代码区域
2-2-1、先上检测图片和提取结果,还有一张颜色表
2-2-1-1、识别的图片

2-2-1-2、提取结果

2-2-1-3、颜色表,看完我已经不会区分颜色了

2-2-2、MyColor 类
2-2-2-1、因为最主要的代码是 MyColor 所以我放到最前面了
/**
     * @Description 自定义颜色类,不是很准确的,但是提取纯色,例如黑白完全没问题
     * @author 姚旭民
     * @date 2019/7/12 18:11
     */
public enum MyColor {//自己划定的几个颜色的颜色分类,会存在识别不出来的颜色
        COLOR_BLACK(0, 66, 0, 66, 0, 66, "黑色", 0),
        COLOR_GRAY(67, 190, 67, 190, 67, 190, "灰色", 0),
        COLOR_WHITE(230, 255, 230, 255, 230, 255, "白色", 0),
        COLOR_RED(70, 255, 0, 200, 0, 200, "红色", 0),
        COLOR_YELLOW(220, 255, 140, 230, 0, 160, "黄色", 0),
        COLOR_ORANGE(200, 255, 85, 110, 0, 61, "橙色", 0),
        COLOR_GREEN(0, 127, 60, 255, 0, 205, "绿色", 0),
        COLOR_CHING(0, 160, 120, 255, 84, 255, "青色", 0),
        COLOR_BLUE(0, 25, 25, 60, 150, 255, "蓝色", 0),
        COLOR_PURPLE(80, 218, 32, 112, 64, 250, "紫色", 0);

        private MyColor(int rMin, int rMax, int gMin, int gMax, int bMin, int bMax, String name, double parcent) {
            this.rMin = rMin;
            this.rMax = rMax;
            this.gMin = gMin;
            this.gMax = gMax;
            this.bMin = bMin;
            this.bMax = bMax;
            this.name = name;
            this.parcent = parcent;
        }

        private int rMin, rMax, gMin, gMax, bMin, bMax;
        private double parcent;
        private String name;

        public int getrMin() {
            return rMin;
        }

        public int getrMax() {
            return rMax;
        }

        public int getgMin() {
            return gMin;
        }

        public int getgMax() {
            return gMax;
        }

        public int getbMin() {
            return bMin;
        }

        public int getbMax() {
            return bMax;
        }

        public String getName() {
            return name;
        }

        public double getParcent() {
            return parcent;
        }

        public void setParcent(double parcent) {
            this.parcent = parcent;
        }

        /**
         * @param r 红色色值
         * @param g 绿色色值
         * @param b 蓝色色值
         * @Description 通过三原色色值查找颜色
         * @author 姚旭民
         * @date 2019/7/9 17:05
         */
        static int findCount = 0;

        public static MyColor find(double r, double g, double b) {//如果可以的话,不要改这里的顺序,因为改了结果会不一样的
            if (r <= COLOR_BLACK.rMax && r >= COLOR_BLACK.rMin && g <= COLOR_BLACK.gMax && g >= COLOR_BLACK.gMin && b <= COLOR_BLACK.bMax && b >= COLOR_BLACK.bMin) {
                return COLOR_BLACK;//黑色
            } else if (r <= COLOR_WHITE.rMax && r >= COLOR_WHITE.rMin && g <= COLOR_WHITE.gMax && g >= COLOR_WHITE.gMin && b <= COLOR_WHITE.bMax && b >= COLOR_WHITE.bMin) {
                return COLOR_WHITE;//白色
            } else if (r <= COLOR_GRAY.rMax && r >= COLOR_GRAY.rMin && g <= COLOR_GRAY.gMax && g >= COLOR_GRAY.gMin && b <= COLOR_GRAY.bMax && b >= COLOR_GRAY.bMin) {
                return COLOR_GRAY;//灰色
            } else if (r <= COLOR_RED.rMax && r >= COLOR_RED.rMin && g <= COLOR_RED.gMax && g >= COLOR_RED.gMin && b <= COLOR_RED.bMax && b >= COLOR_RED.bMin) {
                return COLOR_RED;//红色
            } else if (r <= COLOR_BLUE.rMax && r >= COLOR_BLUE.rMin && g <= COLOR_BLUE.gMax && g >= COLOR_BLUE.gMin && b <= COLOR_BLUE.bMax && b >= COLOR_BLUE.bMin) {
                return COLOR_BLUE;//蓝色
            } else if (r <= COLOR_CHING.rMax && r >= COLOR_CHING.rMin && g <= COLOR_CHING.gMax && g >= COLOR_CHING.gMin && b <= COLOR_CHING.bMax && b >= COLOR_CHING.bMin) {
                return COLOR_CHING;//青色
            } else if (r <= COLOR_GREEN.rMax && r >= COLOR_GREEN.rMin && g <= COLOR_GREEN.gMax && g >= COLOR_GREEN.gMin && b <= COLOR_GREEN.bMax && b >= COLOR_GREEN.bMin) {
                return COLOR_GREEN;//绿色
            } else if (r <= COLOR_ORANGE.rMax && r >= COLOR_ORANGE.rMin && g <= COLOR_ORANGE.gMax && g >= COLOR_ORANGE.gMin && b <= COLOR_ORANGE.bMax && b >= COLOR_ORANGE.bMin) {
                return COLOR_ORANGE;//橙色
            } else if (r <= COLOR_YELLOW.rMax && r >= COLOR_YELLOW.rMin && g <= COLOR_YELLOW.gMax && g >= COLOR_YELLOW.gMin && b <= COLOR_YELLOW.bMax && b >= COLOR_YELLOW.bMin) {
                return COLOR_YELLOW;//黄色
            } else if (r <= COLOR_PURPLE.rMax && r >= COLOR_PURPLE.rMin && g <= COLOR_PURPLE.gMax && g >= COLOR_PURPLE.gMin && b <= COLOR_PURPLE.bMax && b >= COLOR_PURPLE.bMin) {
                return COLOR_PURPLE;//紫色
            }
            if (findCount < 20) {
                Log.i(TAG, "find| r : " + r + ",g : " + g + ",b : " + b);
                findCount++;
            }
            return null;
        }
    }
    
2-2-2-2、测试封装 ColorUtils 类 (MyColor类也在里面)
public class ColorUtils {
    private static final String TAG = ColorUtils.class.getSimpleName();
    //没有什么用的,做测试的,随时都可以删除
    private static Map<MyColor, Integer> mMap = new HashMap<MyColor, Integer>();

    /**
     * @param resId 资源文件夹中的索引id
     * @Description 检查图片资源的颜色占比
     * @author 姚旭民
     * @date 2019/7/12 16:57
     */
    public static Map<String, String> analyseColor(Context context, int resId) {
        return analyseColor(getBitmapFormDrawable(getDrawableFromResources(context, resId)));
    }

    /**
     * @param url sd卡中资源的地址
     * @Description 检查图片资源的颜色占比
     * @author 姚旭民
     * @date 2019/7/12 16:57
     */
    public static Map<String, String> analyseColor(String url) {
        Log.i(TAG, "analyseColor| ");
        FileOutputStream out = null;
        FileInputStream in = null;
        try {
            in = new FileInputStream(url);
            Bitmap bitmap = BitmapFactory.decodeStream(in);
            //开始分析颜色
            return analyseColor(bitmap);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        } finally {
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    Log.e(TAG, e.toString());
                }
            }

            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    Log.e(TAG, e.toString());
                }
            }
        }
        return null;
    }

    /**
     * @param bitmap 资源对象
     * @Description 检查图片资源的颜色占比
     * @author 姚旭民
     * @date 2019/7/12 16:58
     */
    public static Map<String, String> analyseColor(Bitmap bitmap) throws NullPointerException {
        try {
            if (bitmap == null)
                throw new NullPointerException("bitmap is null.");

            int rows = bitmap.getWidth();
            int cols = bitmap.getHeight();
            MyColor key;
            int r, g, b;
            for (int x = 0; x < rows; x++) {
                for (int y = 0; y < cols; y++) {
                    r = Color.red(bitmap.getPixel(x, y));
                    g = Color.green(bitmap.getPixel(x, y));
                    b = Color.blue(bitmap.getPixel(x, y));

                    key = MyColor.find(r, g, b);
                    if (!mMap.containsKey(key)) {
                        mMap.put(key, 1);
                    } else {
                        mMap.put(key, mMap.get(key) + 1);
                    }
                }
            }

            Log.i(TAG, "analyseColor| MyColor JackTestMethod mMap的值为 : " + JSON.toJSONString(mMap));
            return parcentage(rows * cols);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }

        return null;
    }


    /**
     * @return 返回一个保存颜色和占比的 Map<String, Double> 对象
     * @Description 计算百分比
     * @author 姚旭民
     * @date 2019/7/10 19:08
     */
    public static Map<String, String> parcentage(int total) {
        MyColor temp;
        Map<String, String> result = new HashMap<String, String>();

        for (Map.Entry<MyColor, Integer> entry : mMap.entrySet()) {
            temp = entry.getKey();
            if (temp != null) {
                temp.setParcent((entry.getValue() * 1.0) / total);
                Log.i(TAG, "parcentage| name : " + temp.getName() + ",parcent : " + temp.getParcent() * 100 + "%");
                result.put(temp.getName(), temp.getParcent() * 100 + "%");
            }
        }

        return result;
    }

    public static Bitmap getBitmapFormDrawable(Drawable drawable) {
        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE
                        ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        //设置绘画的边界,此处表示完整绘制
        drawable.draw(canvas);
        return bitmap;
    }

    public static Drawable getDrawableFromResources(Context context, int resId) {
        return context.getResources().getDrawable(resId);
    }

    public enum MyColor {//自己划定的几个颜色的颜色分类
        COLOR_BLACK(0, 66, 0, 66, 0, 66, "黑色", 0),
        COLOR_GRAY(67, 190, 67, 190, 67, 190, "灰色", 0),
        COLOR_WHITE(230, 255, 230, 255, 230, 255, "白色", 0),
        COLOR_RED(70, 255, 0, 200, 0, 200, "红色", 0),
        COLOR_YELLOW(220, 255, 140, 230, 0, 160, "黄色", 0),
        COLOR_ORANGE(200, 255, 85, 110, 0, 61, "橙色", 0),
        COLOR_GREEN(0, 127, 60, 255, 0, 205, "绿色", 0),
        COLOR_CHING(0, 160, 120, 255, 84, 255, "青色", 0),
        COLOR_BLUE(0, 25, 25, 60, 150, 255, "蓝色", 0),
        COLOR_PURPLE(80, 218, 32, 112, 64, 250, "紫色", 0);

        private MyColor(int rMin, int rMax, int gMin, int gMax, int bMin, int bMax, String name, double parcent) {
            this.rMin = rMin;
            this.rMax = rMax;
            this.gMin = gMin;
            this.gMax = gMax;
            this.bMin = bMin;
            this.bMax = bMax;
            this.name = name;
            this.parcent = parcent;
        }

        private int rMin, rMax, gMin, gMax, bMin, bMax;
        private double parcent;
        private String name;

        public int getrMin() {
            return rMin;
        }

        public int getrMax() {
            return rMax;
        }

        public int getgMin() {
            return gMin;
        }

        public int getgMax() {
            return gMax;
        }

        public int getbMin() {
            return bMin;
        }

        public int getbMax() {
            return bMax;
        }

        public String getName() {
            return name;
        }

        public double getParcent() {
            return parcent;
        }

        public void setParcent(double parcent) {
            this.parcent = parcent;
        }

        /**
         * @param r 红色色值
         * @param g 绿色色值
         * @param b 蓝色色值
         * @Description 通过三原色色值查找颜色
         * @author 姚旭民
         * @date 2019/7/9 17:05
         */
        static int findCount = 0;

        public static MyColor find(double r, double g, double b) {
            if (r <= COLOR_BLACK.rMax && r >= COLOR_BLACK.rMin && g <= COLOR_BLACK.gMax && g >= COLOR_BLACK.gMin && b <= COLOR_BLACK.bMax && b >= COLOR_BLACK.bMin) {
                return COLOR_BLACK;//黑色
            } else if (r <= COLOR_WHITE.rMax && r >= COLOR_WHITE.rMin && g <= COLOR_WHITE.gMax && g >= COLOR_WHITE.gMin && b <= COLOR_WHITE.bMax && b >= COLOR_WHITE.bMin) {
                return COLOR_WHITE;//白色
            } else if (r <= COLOR_GRAY.rMax && r >= COLOR_GRAY.rMin && g <= COLOR_GRAY.gMax && g >= COLOR_GRAY.gMin && b <= COLOR_GRAY.bMax && b >= COLOR_GRAY.bMin) {
                return COLOR_GRAY;//灰色
            } else if (r <= COLOR_RED.rMax && r >= COLOR_RED.rMin && g <= COLOR_RED.gMax && g >= COLOR_RED.gMin && b <= COLOR_RED.bMax && b >= COLOR_RED.bMin) {
                return COLOR_RED;//红色
            } else if (r <= COLOR_BLUE.rMax && r >= COLOR_BLUE.rMin && g <= COLOR_BLUE.gMax && g >= COLOR_BLUE.gMin && b <= COLOR_BLUE.bMax && b >= COLOR_BLUE.bMin) {
                return COLOR_BLUE;//蓝色
            } else if (r <= COLOR_CHING.rMax && r >= COLOR_CHING.rMin && g <= COLOR_CHING.gMax && g >= COLOR_CHING.gMin && b <= COLOR_CHING.bMax && b >= COLOR_CHING.bMin) {
                return COLOR_CHING;//青色
            } else if (r <= COLOR_GREEN.rMax && r >= COLOR_GREEN.rMin && g <= COLOR_GREEN.gMax && g >= COLOR_GREEN.gMin && b <= COLOR_GREEN.bMax && b >= COLOR_GREEN.bMin) {
                return COLOR_GREEN;//绿色
            } else if (r <= COLOR_ORANGE.rMax && r >= COLOR_ORANGE.rMin && g <= COLOR_ORANGE.gMax && g >= COLOR_ORANGE.gMin && b <= COLOR_ORANGE.bMax && b >= COLOR_ORANGE.bMin) {
                return COLOR_ORANGE;//橙色
            } else if (r <= COLOR_YELLOW.rMax && r >= COLOR_YELLOW.rMin && g <= COLOR_YELLOW.gMax && g >= COLOR_YELLOW.gMin && b <= COLOR_YELLOW.bMax && b >= COLOR_YELLOW.bMin) {
                return COLOR_YELLOW;//黄色
            } else if (r <= COLOR_PURPLE.rMax && r >= COLOR_PURPLE.rMin && g <= COLOR_PURPLE.gMax && g >= COLOR_PURPLE.gMin && b <= COLOR_PURPLE.bMax && b >= COLOR_PURPLE.bMin) {
                return COLOR_PURPLE;//紫色
            }
            if (findCount < 20) {
                Log.i(TAG, "find| r : " + r + ",g : " + g + ",b : " + b);
                findCount++;
            }
            return null;
        }
    }

}

转载于:https://my.oschina.net/grkj/blog/3073524

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值