文档章节

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

jack__0023
 jack__0023
发布于 07/12 18:18
字数 1901
阅读 63
收藏 5

支持技术分享,转载或复制,请指出文章来源此博客作者为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;
        }
    }

}

© 著作权归作者所有

jack__0023
粉丝 12
博文 18
码字总数 16673
作品 0
深圳
程序员
私信 提问
Java 验证码识别库 Tess4j 学习

Java 验证码识别库 Tess4j 学习 【在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下学习过程及遇...

_TBHacker
2018/08/01
0
0
linux 下使用命令查看jvm信息

java程序员除了编写业务代码之外,特别是项目上线之后,更需要关注的是系统的性能表现,这个时候就需要了解一下jvm的性能表现了,可以借助于java虚拟机自带的一些分析工具,主要有三个常用的...

boonya
07/10
0
0
玩大数据一定用得到的19款 Java 开源 Web 爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引...

两味真火
2016/09/23
15.4K
12
Spring 对JDBC操作的支持

在用JDBC进行数据库的操作的时候会在每个DAO中写有很多重复和类似的代码(建立连接,关闭连接等等),Spring的JDBC框架对这些重复的操作做了提取,形成了模板,使用Spring的JDBC框架的开发者通过提...

晨曦之光
2012/04/25
1K
0
android 围绕中心旋转动画

本文主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类...

程序袁_绪龙
2015/03/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
5
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
19
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部