我写了一个简单的应用程序,它显示了图像中触摸颜色的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时才会发生。
我会很乐意帮助你。
顺便说一下。对不起我的英文。
答案 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