0

画像から触れた色の RGB 値を表示する簡単なアプリケーションを作成しました。問題は、画像に触れるたびに RGB 値の 1 つが 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);

もう 1 つの問題は、画面上で指を動かしたときに背景の色を変更することはできますが、Bluetooth 経由でマイクロコントローラーに送信しようとすると問題が発生することです。フェ。黒を 2 回タッチすると、最初に黒が送信され、次に青が送信されます。: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これは、最後のバイトを除くコードがアルファまたはその逆であるためです。
私の提案は、画像を変更してもう一度試すか、次のコードを使用して、どのバイトがアルファ値を表しているかを確認することです。
画像がimage/jpegそうであれば、アルファは常にあるはず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]);

私のテキストビューにはfeが表示されます。つまり、ピンク色に「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 ランプの色を変更できます。アプリケーションで使用しているイメージは次のとおりです。 クリック

于 2013-10-28T11:36:49.497 に答える