获取图片上任意一点的颜色值

点击屏幕上任意一点,获取点击处的颜色值(RGB),还可以将十进制颜色值转化为十六进制颜色值显示,下面是个程序的样例:

package com.junto.text;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by WangJinyong on 2019/1/23.
 * 获取图片上任意一点的颜色值
 */
public class GetImgColorActivity extends Activity implements View.OnTouchListener {

    DisplayMetrics metrics;
    int screenWidth;//屏幕宽
    int screenHeigh;//屏幕高
    ImageView img;
    StringBuilder sb = new StringBuilder();
    Bitmap img1 = null;
    int X,Y;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_getimgcolor);
        metrics = getResources().getDisplayMetrics();
        screenWidth = metrics.widthPixels;//屏幕宽
        screenHeigh = metrics.heightPixels;//屏幕高
        Log.e("GetImgColorActivity", "screenWidth:" + screenWidth + "screenHeigh:" + screenHeigh);
        Log.e("GetImgColorActivity", "metrics.density:" + metrics.density + "metrics.densityDpi:" + metrics.densityDpi);
        Log.e("GetImgColorActivity", "metrics.xdpi:" + metrics.xdpi + "metrics.ydpi:" + metrics.ydpi);
        img = findViewById(R.id.img);
        img.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        try {
            switch (motionEvent.getAction()) {
                /**
                 * 点击的开始位置
                 */
                case MotionEvent.ACTION_DOWN:
                    Color.parseColor("#FF1000");
                    Log.e("tag","十六进制 颜色代码 转换为  int   类型数值="+Color.parseColor("#FF1000"));
                    toHexEncoding(-61440);
                    Log.e("tag","十进制颜色值转化为十六进制的颜色值显示="+toHexEncoding(-61440));
                    Log.e("tag","十进制颜色值转化为十六进制的颜色值显示0="+toHexEncoding(0));
                    Log.e("tag","十进制颜色值转化为十六进制的颜色值显示204="+toHexEncoding(204));
                    Log.e("tag","十进制颜色值转化为十六进制的颜色值显示255="+toHexEncoding(255));
                    //将单个十进制(RGB)转换成16进制数值,然后再截取拼起来成为“#FFFFFF”的形式
                    String str = "#" + toHexEncoding(0).substring(6)+toHexEncoding(204).substring(6)+toHexEncoding(255).substring(6);
                    Log.e("tag","str="+str);
                    Log.e("GetImgColorActivity", "img.getWidth():" + img.getWidth() + "img.getHeight():" + img.getHeight());
                    X = (int) motionEvent.getX() / 2;
                    Y = (int) motionEvent.getY() / 2;
                    Log.e("GetImgColorActivity", "起始位置:" + X + "," + Y);

                    //根据坐标获取
                    Bitmap bitmap = ((BitmapDrawable) img.getDrawable()).getBitmap();
//                    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.temp11);
                    Log.e("GetImgColorActivity", "bitmap.getHeight():" + bitmap.getWidth() + "," + bitmap.getHeight());

                    PointThread pointThread = new PointThread();
                    pointThread.start();

                    break;
                /**
                 * 触屏实时位置
                 */
                case MotionEvent.ACTION_MOVE:
                    Log.e("GetImgColorActivity", "实时位置:" + motionEvent.getX() + "," + motionEvent.getY());
                    break;
                /**
                 * 离开屏幕的位置
                 */
                case MotionEvent.ACTION_UP:
                    Log.e("GetImgColorActivity", "结束位置:" + motionEvent.getX() + "," + motionEvent.getY());
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         *  注意返回值
         *  true:view继续响应Touch操作;
         *  false:view不再响应Touch操作,故此处若为false,只能显示起始位置,不能显示实时位置和结束位置
         */
        return false;
    }

    class PointThread extends Thread {
        @Override
        public void run() {
            super.run();
            try {
                BitmapFactory.Options bfoOptions = new BitmapFactory.Options();
                bfoOptions.inScaled = false;
                img1 = BitmapFactory.decodeResource(getResources(), R.mipmap.temp11, bfoOptions);
                int bm_width = img1.getWidth();
                int bm_height = img1.getHeight();
                Log.e("GetImgColorActivity", "bm_width:" + bm_width + ",bm_height=" + bm_height);
                sb.append("[");
                for (int i = 0; i < bm_width + 1; i++) {
                    for (int j = 0; j < bm_height + 1; j++) {
//                        Log.e("tag", "{i:" + i + ",j:" + j + "},");
                        sb.append("{i:" + i + ",j:" + j + "},");
                    }
                }
                sb.replace(sb.length(), sb.length(), "]");
                Log.e("tag", "sb.toString()=" + sb.toString());
                Log.e("tag", "sb.length()=" + sb.length());
                JSONArray jsonArray = null;

                jsonArray = new JSONArray(sb.toString());
                Log.e("tag", "jsonArray=" + jsonArray.length());
                int pixel = img1.getPixel(X, Y);
                //获取颜色
                int redValue = Color.red(pixel);
                int greenValue = Color.green(pixel);
                int blueValue = Color.blue(pixel);
                Log.e("GetImgColorActivity", "redValue=" + redValue);
                Log.e("GetImgColorActivity", "greenValue=" + greenValue);
                Log.e("GetImgColorActivity", "blueValue=" + blueValue);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 十进制颜色值转化为十六进制的颜色值显示
     */
    public static String toHexEncoding(int color) {
        String R, G, B;
        StringBuffer sb = new StringBuffer();
        R = Integer.toHexString(Color.red(color));
        G = Integer.toHexString(Color.green(color));
        B = Integer.toHexString(Color.blue(color));
        //判断获取到的R,G,B值的长度 如果长度等于1 给R,G,B值的前边添0
        R = R.length() == 1 ? "0" + R : R;
        G = G.length() == 1 ? "0" + G : G;
        B = B.length() == 1 ? "0" + B : B;
        sb.append("0x");
        sb.append(R);
        sb.append(G);
        sb.append(B);
        return sb.toString();
    }
}
发布了92 篇原创文章 · 获赞 38 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/u013184970/article/details/88550729
今日推荐