마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

비트맵 변환시 에러 관련 질문

0 추천

안녕하세요.

이미지뷰의 이미지를 비트맵으로 변환하여 비트맵의 pixcel값을 추출> rgb값으로 변환하는 코드 입니다.

그런데 자꾸 IllegalArgumentException: x must be < bitmap.width() 에러가 뜹니다.

 

코드 첨부합니다. 지적 바랍니다. 감사합니다.

 

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView iv = (ImageView) findViewById(R.id.imageView);
        iv.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        BitmapDrawable D = (BitmapDrawable)((ImageView)findViewById(R.id.imageView)).getDrawable();
        Bitmap bitmap = D.getBitmap();

        Bitmap bm= bitmap.copy(Bitmap.Config.ARGB_8888, true);
        int bValue = bm.getPixel(x, y) & 0x000000FF;
        int gValue = (bm.getPixel(x, y) & 0x0000FF00) >> 8;
        int rValue = (bm.getPixel(x, y) & 0x00FF0000) >> 16;

        TextView tv = (TextView)findViewById(R.id.textView2);
        tv.setText("R = " + rValue + "," + "G = " + gValue+  "," + "B = " + bValue);
    }
}
후니02 (820 포인트) 님이 2016년 12월 7일 질문

1개의 답변

0 추천
 
채택된 답변
x값이 이미지 가로사이즈보다 더 큰 값이 입력되었다고 합니다. x 값을 어디서 설정했는지는 모르겠지만 그쪽 로직을 확인해 보세요.
익명사용자 님이 2016년 12월 7일 답변
후니02님이 2016년 12월 7일 채택됨
안녕하세요. 답변 감사합니다.
저 코드 외에 다른 코드는 없습니다.
x값을 따로 설정해 준적도 없구요ㅠ.ㅠ
잘 못 아신 듯 한데요.
 x의  type을 선언도 안 했는데 컴파일이 되서 실행되어 해당 부분에서 오류가 날 수가 없잖아요..
int x 라고 정의 된 곳을 찾아보세요..
정말 코드가 저게 다예요...
x,y가 빨간 줄이었는데 alt+enter 했어요.
alt + enter하셔서  알수 없는 값이  import 된 듯 합니다.

직접 해 보니, 아무래도
import static android.R.attr.x;
import static android.R.attr.y;  가 import 된 듯  한데..

이걸 지우고,.

int x= 0,  y =0;
int bValue = bm.getPixel(x, y) & 0x000000FF;
이런 씩으로 x, y 값을 정한 후 해 보세요
세상에.... 정말 바보같았네요 죄송합니다 그리고 너무너무 감사합니다. 날씨 추운데 감기 조심하세요!
그런데, 어느 부분을 클릭해도 다 같은 값이 나오는데.. 왜 그런걸까요?
x, y 값을 클릭한 위치값으로 변경 해 주셔야 합니다.
현재는 둘다 0이니 동일하게 나오죠..ㅎㅎ

OnClickListener 가 아닌  onTouchEvent 를 사용해서
 x, y 좌표를 변경하세요..
http://stackoverflow.com/questions/3476779/how-to-get-the-touch-position-in-android

단 터치시 들어오는 x,y 좌표와
실제 이미지 좌표와 다를 수 있으니, 잘 조정 해 주셔야 합니다.

예를 들어  이미지 크기기 480:320 이나 실제 화면은 960:640일 경우
onTouchEvent 로 들어오는 좌표가  800:400 일 경우 이미지 좌표보다 크게 들어오니, 오류 납니다.


이미지 x 좌표 = 화면 터치 x 좌표 * 480 / 960
이미지 y 좌표 = 화면 터치 y 좌표 * 480 / 960

와 같은 수식을 사용해서, 비율대로 실제 이미지 x, y 값을 400:200 으로 각각 변경 해 주셔야 합니다.
와.. 자세한 설명 감사합니다.
그럼, bitmap 사용은 안해도 되는건가요ㅠㅠ?
해보는데 잘 안되네요...
이미지의 RGB 정보를 구하려면 사용해야 할 듯 한데요.

뭐 데이터를 변환하는게 아니라 단순 RGB 값을 출력하는 것이라면,
bitmap.copy 는 굳이 안 부르시고 바로
bitmap.getPixel(x, y) 로 RGB 정보를 구하는건 가능할 듯 합니다.
헐!!!!!! 됐어요ㅠㅠㅠㅠㅠ 감사합니다 진짜!!!
...