2011-11-20 4 views
0

이 코드의 문제점은 사용자가 클릭/터치하는 장소가 아닌 모든 그림의 색상 값만 가져옵니다! 간단한 문제가 있어야합니다, 나는 믿습니다! 코드는 다음과 같습니다. ;)갤러리에서 가져온 이미지에서 Android의 픽셀 색상을 얻으시겠습니까?

import java.io.FileNotFoundException; 
import java.util.Locale; 
import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Color; 
import android.graphics.drawable.BitmapDrawable; 
import android.net.Uri; 
import android.os.Bundle; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MPActivity extends Activity { 

private TextToSpeech mTts; 
private ImageView targetImage; 
private TextView textView; 
private TextView textViewCol; 
private TextView textViewVal; 
private boolean hasTTSBeenInitialized = false; 

private int imageWidth; 
private int imageHeight; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button buttonLoadImage = (Button)findViewById(R.id.loadimage); 

textView = (TextView) findViewById(R.id.textView); 
textViewCol = (TextView) findViewById(R.id.textViewColor); 
targetImage = (ImageView) findViewById(R.id.targetimage); 
textViewVal = (TextView) findViewById(R.id.textViewValue); 

targetImage = (ImageView)findViewById(R.id.targetimage); 

buttonLoadImage.setOnClickListener(new Button.OnClickListener(){ 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    Intent intent = new Intent(Intent.ACTION_PICK, 
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(intent, 0); 
}}); 
mTts = new TextToSpeech(this, new OnInitListener() {  
     @Override 
     public void onInit(int status) { 
     hasTTSBeenInitialized = true; 
     } 
     }); 

     mTts.setLanguage(Locale.US); 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
// TODO Auto-generated method stub 
super.onActivityResult(requestCode, resultCode, data); 

if (resultCode == RESULT_OK){ 
Uri targetUri = data.getData(); 
Bitmap bitmap; 
try { 
    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri)); 
    //w2,h2 
    imageWidth = bitmap.getWidth(); 
    imageHeight = bitmap.getHeight(); 

    targetImage.setImageBitmap(bitmap); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 


} 

targetImage.setOnTouchListener(new ImageView.OnTouchListener(){  


public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    int x = ((int)event.getX()/v.getWidth()) * imageWidth; 
    int y = ((int)event.getY()/v.getHeight()) * imageHeight; 

    textView.setText("Touch coordinates : "+String.valueOf(event.getX())+"x"+String.valueOf(event.getY())); 
    ImageView imageView = ((ImageView)v); 
    Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap(); 

    // Calculation -> x, y - image space 


    int pixel = bitmap.getPixel(x,y); 

    textViewVal.setText("[" + Color.red(pixel) + "," + Color.green(pixel) + "," + Color.blue(pixel) + "]"); 

    if ((Color.red(pixel) > 200) && (Color.blue(pixel) < 10) && (Color.green(pixel) < 10)) { 
     if(hasTTSBeenInitialized){ 
      mTts.speak("Color is RED", TextToSpeech.QUEUE_FLUSH, null); 
     } 
     textViewCol.setText("Color is Red."); 
    } 

    return true; }  
}); 


} 

} 
+0

너무 피곤할 수도 있지만 x 및 y 값을 지정하는 코드에서 찾을 수 없습니다. – HenrikS

+0

여기에서 코드를 업데이트했고 프로그램에서 읽는 예제로 RED를 넣었습니다 ... 감사합니다 ... – user1056066

답변

2

정수 나누기에 문제가있는 것 같습니다. 이 표현은 아마도 제로 산출 :

당신이 결과를 의미 int, 정수 나눗셈이 일어나는 intgetWidth() 반환에 getX()의 값을 캐스팅 한 이후
(int)event.getX()/v.getWidth() 

가장 가까운 낮은 정수로 잘립니다. 대신, 나누기 전에 곱셈을 수행하고 캐스트를 마지막으로 남겨 둡니다.

int x = (int) (event.getX() * imageWidth/v.getWidth()); 
int y = (int) (event.getY() * imageHeight/v.getHeight()); 
+0

감사합니다. 매우 잘 작동하지만 ... 죄송합니다. 내 평판은 너무 낮습니다. 답변을 위해 투표 할 수 없습니다! – user1056066

+0

기쁘다. 내 대답이 도움이되었다 니. 옆에있는 체크 표시를 클릭하여 수락 할 수 있어야합니다. – kabuko

관련 문제