0

我编写了一个简单的应用程序,它向您显示图像中触摸颜色的 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 时才会发生这种情况。

我会很感激任何帮助。

顺便说一句。对不起我的英语不好。

4

2 回答 2

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.

试一试,然后回来报告,我们需要修复它。

于 2013-10-27T17:55:53.907 回答
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]);

我的 textview 向我展示了 fe。那:“A:-1 R:-1 G:25 B:-7”粉红色。如果我触摸到白色以外的其他地方,则不可能有 3 个 RGB 值中的 2 个等于 -1。

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

如果(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灯的颜色。这是我在应用程序中使用的图像。 点击

于 2013-10-28T11:36:49.497 回答