2014-03-06 2 views
1

친구, android를 처음 사용하며 일부 이미지 처리가 필요한 프로젝트 작업 중입니다. 내가getPixel은 안드로이드에서 음수 값을 반환합니다.

int pixels=myImageBitmap.getPixel(x,y); 

를 사용하려고 할 때 내가 점점 오전 모든 후, 갑자기 중지

result.setPixel(x,y,pixels); 

내 응용 프로그램을 사용하여 X 또한 내가 그 픽셀에 대한 몇 가지 값을 설정하려고 몇 가지 negetive 값입니다 즉, 내 로그 고양이는 누군가 미리

에 감사이 error.please 나가 ​​저를 도와주세요
03-06 19:52:01.731: W/dalvikvm(29185): threadid=1: thread exiting with uncaught exception (group=0x41036378) 
03-06 19:52:01.731: E/AndroidRuntime(29185): FATAL EXCEPTION: main 
03-06 19:52:01.731: E/AndroidRuntime(29185): java.lang.IllegalStateException 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.graphics.Bitmap.setPixel(Bitmap.java:1045) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at com.example.testpro.EncodeActivity$3.onClick(EncodeActivity.java:90) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.view.View.performClick(View.java:4147) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.view.View$PerformClick.run(View.java:17161) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.os.Handler.handleCallback(Handler.java:615) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.os.Looper.loop(Looper.java:213) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at android.app.ActivityThread.main(ActivityThread.java:4787) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at java.lang.reflect.Method.invokeNative(Native Method) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at java.lang.reflect.Method.invoke(Method.java:511) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
03-06 19:52:01.731: E/AndroidRuntime(29185): at dalvik.system.NativeStart.main(Native Method) 

처럼 보이는 android.graphics.Bitmap.setPixel (Bitmap.java:1045)에서 617,451,515,는
+0

당신은 시험 할 코드를 게시해야합니다 ... –

+0

아마도 x와 y가 범위를 벗어났습니다. – Simon

+0

이 경우 예외는 IllegalStateException 대신에 IllegalArgumentException이 될 것이라고 생각합니다. –

답변

0

java.lang.IllegalStateException bitmap 사용하는 경우 예외가 발생

immutable입니다. As per document

이유 : 당신은 비트 맵의 ​​픽셀의 변화를 만들려고 여기

result.setPixel(x,y); 

. 비트 맵은 변경 가능하지 않으므로 허용되지 않으므로 예외가 발생합니다.

해결책 : 변경할 수있는 비트 맵 복사본을 만듭니다. 사용하십시오.

내가 두 개의 비트 맵 이미지의 픽셀 값을 비교, 첫 번째는 하나 및 복사, 내가 얻고 다른 값 :

myImageBitmap = myImageBitmap.copy(Bitmap.Config.ARGB_8888, true); 

자세한 내용은 Android- convert imutable bitmap to mutable

업데이트를 참조하십시오 같은 픽셀을 위해, 왜?

copy(Bitmap.Config config, boolean isMutable) 

시도 횟수가 지정된 하나에 새로운 비트 맵의 ​​구성을 설정 한 다음 새로운 맵으로 비트 맵의 ​​픽셀을 카피 비트 맵, 의 크기에 기초하여 새로운 맵을 만들기 위해. 변환이 이 아니거나 할당자가 실패하면 NULL을 반환합니다. Refer this

이 방법에서 지정된 비트 맵 구성 (Bitmap.Config)은 픽셀 저장 방법을 설명합니다. 이는 투명/반투명 색상을 표시하는 기능은 물론 품질 (색상 수)에 영향을줍니다.

getPixel()의 설명서를 보면 색상 값 인 정수가 반환됩니다.

원본 이미지와 복사 된 이미지에 사용 된 비트 맵 구성이 다른 경우 동일한 픽셀에 대해 다른 값을 갖게됩니다.

픽셀 값의 차이를 유발할 수있는 또 다른 이유는 픽셀의 사전 곱셈/비표 준화입니다. Refer this nice information from Chet Hasse.

+0

나는 그것을 시험해 보았다, 그것은 완전하게 일한다, 고맙다. 그리고, 내가 두 비트 맵 이미지의 픽셀 값을 비교할 때, 첫 번째 복사본과 복사본, 같은 픽셀에 대해 다른 값을 얻는 이유는 무엇입니까? – Abinthaha

+0

대답으로 받아 드리기를 권합니다. 그래서 미래 사용자에게 유용 할 것입니다. –

+0

답변을 업데이트했습니다. –

관련 문제