0

我的应用程序正在从图库中调用图像,当您单击图像的某个位置时,它会发出颜色。我面临一个问题;我正在使用这些代码来获取图像上每个位置的颜色值。有趣的是,它正确检测颜色值(即对于红色,它显示 r=255,g=0,b=0)但是当谈到颜色名称时(我使用 'TextToSpeech' 来表示颜色名称),它主要说“颜色是黑色(除非你点击白色,它说颜色是白色。这是我的代码:

    if  ((Color.red(pixel) & Color.blue(pixel) & Color.green(pixel))> 220) {
        if(TTSInitialized){
            mTts.speak("Color is White", TextToSpeech.QUEUE_FLUSH, null);
        }
        textViewCol.setText("Color is White.");
        return true;}

    if  ((Color.red(pixel) & Color.blue(pixel) & Color.green(pixel)) < 10) {
        if(TTSInitialized){
            mTts.speak("Color is Black", TextToSpeech.QUEUE_FLUSH, null);
        }
        textViewCol.setText("Color is Black.");
        return true;}

    if  ((Color.red(pixel) & Color.blue(pixel)) > 120) {
        if(TTSInitialized){
            mTts.speak("Color is Purple", TextToSpeech.QUEUE_FLUSH, null);

        }
        textViewCol.setText("Color is Purple.");
    return true;}

    if  (Color.red(pixel) > (Color.blue(pixel) & Color.green(pixel))) {
        if(TTSInitialized){
            mTts.speak("Color is  RED", TextToSpeech.QUEUE_FLUSH, null);
        }
        textViewCol.setText("Color is  Red.");
        return true;}

我的应用程序有红色、绿色、蓝色、黄色、紫色、青色、黑色和白色。现在的问题是:我编写代码的方式是否正确?如果没有,你有什么建议?为什么它总是说黑色,无论你点击红色、蓝色或任何其他颜色?!

4

1 回答 1

1

你在第二次检查时有点偏离。我想你想要这个:

  if  ((Color.red(pixel) | Color.blue(pixel) | Color.green(pixel)) < 10) {
        if(TTSInitialized){
            mTts.speak("Color is Black", TextToSpeech.QUEUE_FLUSH, null);
        }
        textViewCol.setText("Color is Black.");
        return true;
   }

这样你就可以对这些值进行 OR'ing 并获得累积量,而不是三个值中的最小值。

例如:

3 | 7 | 255 = 255

但是 3 & 7 & 255 = 3

另外,有了你所有的支票,我可能会重做。& 实际上检查的是位掩码而不是强度。使用 &,您只能获得在每个数字中设置的位。

对于白色,我会使用:

if  (Color.red(pixel) > 220 && Color.blue(pixel) > 220 && Color.green(pixel) > 220)

紫色:

if  (Color.red(pixel) > 120  && Color.blue(pixel) > 120)

红色:

if  (Color.red(pixel) > (Color.blue(pixel) | Color.green(pixel)))
于 2013-06-05T02:52:42.443 回答