RGB值之一始终为255 - ANDROID

时间:2013-10-27 12:27:09

标签: java android colors bluetooth rgb

我写了一个简单的应用程序,它显示了图像中触摸颜色的RGB值。 问题是,每当我触摸我的图像时,RGB值之一就是255。 例如。我应该有值#F0F0F0我有#FFF0F0或#F0FFF0。

这是我的代码:

iv = (ImageView) findViewById(R.id.imageView1);
    mTextLog = (TextView) findViewById(R.id.textView3);
    iv.setOnTouchListener(new OnTouchListener() {

        int x = 0, y = 0;
        float fx, fy;
        public boolean onTouch(View v, MotionEvent event) {

            ImageView imageView = ((ImageView)v);
            Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
            v.getWidth();
            v.getHeight();
            bitmap.getWidth();
            bitmap.getHeight();
            fx = ((event.getX()/656)*960);
            fy = ((event.getY()/721)*1029);
            if(fx > 950) fx = 950;
            if(fy > 1000) fy = 1000;
            if(fx < 32) fx = 32;
            x = Math.round(fx);
            y = Math.round(fy);

            if(fx > 0 && fy > 0){

            int pixel = bitmap.getPixel(x, y);
            int redValue = Color.red(pixel);
            int blueValue = Color.blue(pixel);
            int greenValue = Color.green(pixel);
            if(redValue > 255) redValue = 255;
            if(redValue < 0) redValue = 0;
            if(greenValue > 255) greenValue = 255;
            if(greenValue < 0) greenValue = 0;
            if(blueValue > 255) blueValue = 255;
            if(blueValue < 0) blueValue = 0;

            br = (byte) redValue;
            bg = (byte) greenValue;
            bb = (byte) blueValue;

            tv2.setText("Red: " + redValue + " Green: " + greenValue + " Blue: " + blueValue);
            RelativeLayout rl = (RelativeLayout) findViewById(R.id.idd);
            rl.setBackgroundColor(pixel);

另一个问题是,当我在屏幕上移动手指时,在背景上查找颜色很好,但是当我试图通过蓝牙将其发送到我的microkontroler时,会出现问题。 铁。如果我触摸黑色两次,它会先发黑色,然后发蓝色。 :o

只有当我从这个onTouch方法返回true时才会发生。

我会很乐意帮助你。

顺便说一下。对不起我的英文。

2 个答案:

答案 0 :(得分:0)

我在你的代码中看到了一些冲突(奇怪!)。第一个,如果你正确计算颜色,所以如果大于255或小于0,则无需检查值,我的意思是这些行。

    if(redValue > 255) redValue = 255;
    if(redValue < 0) redValue = 0;
    if(greenValue > 255) greenValue = 255;
    if(greenValue < 0) greenValue = 0;
    if(blueValue > 255) blueValue = 255;
    if(blueValue < 0) blueValue = 0;

和(也许)图像(正在处理)颜色类型与您预期的不同,正如您提到的示例black然后blue,这可能是因为除最后一个字节之外的代码为Alpha或反之亦然。
我的建议是更改图像并进行另一次尝试,或使用以下代码确保哪个字节代表alpha值 如果图片为image/jpeg,则alpha应始终为0xFF(255)

byte[] hcolor;
hcolor=ByteBuffer.allocate(4).putInt(pixel).array();
out(hcolor[0]);//the first byte represent the alpha, so it should be 255.

只是试一试并回来报告,我们需要修复它。

答案 1 :(得分:0)

我换了几行,问题仍然存在。

          int pixel = bitmap.getPixel(x, y);
          int redValue = Color.red(pixel);
          int blueValue = Color.blue(pixel);
          int greenValue = Color.green(pixel);
          hcolor = ByteBuffer.allocate(4).putInt(pixel).array();
          br = (byte) redValue;
          bg = (byte) greenValue;
          bb = (byte) blueValue;

          //tv2.setText("Red: " + redValue + " Green: " + greenValue >+ " Blue: " + blueValue);
          tv2.setText("A: " + hcolor[0] + " R: " + hcolor[1] + " G: " >+ hcolor[2] + " B: " + hcolor[3]);

我的文本视图显示了我。 :粉红色的“A:-1 R:-1 G:25 B:-7”。 如果我触摸其他地方而不是白色,则3个RGB值中的2个等于-1是不可能的。

我使用的代码将颜色发送到微控制器。 “H”是我的“关键”,uC理解为“现在有一个RGB值”

  

if(mConnectedThread!= null){

              mConnectedThread.write(h);
              try {
                  Thread.sleep(5);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              mConnectedThread.write(br);
              try {
                  Thread.sleep(5);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              mConnectedThread.write(bg);
              try {
                  Thread.sleep(5);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              mConnectedThread.write(bb);
              try {
                  Thread.sleep(5);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
     

当我从这个onTouch方法返回“false”时,没有任何错误发生。   我只是想触摸并移动我的手指来实时改变RGB灯的颜色。   这是我在应用程序中使用的图像。   click