2012-05-29 3 views
3

특정 이미지의 비트 맵 이미지를 만들고 싶지만 비트 맵 이미지의 너비와 높이에 저항하고 싶습니다. 내가 ......이미지를 비트 맵으로 변환

image2 = BitmapFactory.decodeResource(getResources(), rid); 
     Log.w("DEBUG","which is null:image i " + i.getWidth() + " OR " +i.getDrawable().getIntrinsicHeight()); 
     Log.w("DEBUG","which is null:image h " + h.getWidth() + " OR " +h.getHeight()); 
     Log.w("DEBUG","which is null:image2 " + image2.getWidth() + " OR " +image2.getHeight()); 

    Bitmap image = Bitmap.createScaledBitmap(image2, i.getWidth(), i.getHeight(), false); 
     Log.w("DEBUG","which is null:image " + image.getWidth() + " OR " +image.getHeight()); 
     double bmWidth = image.getWidth(); 
      double bmHeight = image.getHeight(); 
      if (x < 0 || y < 0 || x > getWidth() || y > getHeight()){ 
       return 0; //Invalid, return 0 
       }else{ 
       //Convert touched x, y on View to on Bitmap 
       int xBm = (int)(x * (bmWidth/getWidth())); 
       int yBm = (int)(y * (bmHeight/getHeight())); 
       return image.getPixel(xBm, yBm); 

를 다음 코드를 사용하고 있지만, 그것은 나에게 동일한 출력을 반환하지 않습니다 ........ 그것은 나에게 같은 폭과 높이를 보여주는하지만 내 원하는 출력은 오지 마라. 내 원하는 출력 높이에 큰 ...... ...... 그래서 그것을 극복하는 방법. 하나는 편집 나에게

을 제안 아니 할 수 있습니다 스택 트레이스 ...

this.setDrawingCacheEnabled(true); 

     // this is the important code :) 
     // Without it the view will have a dimension of 0,0 and the bitmap will be null   
     this.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     this.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight()); 

     this.buildDrawingCache(true); 
     Bitmap image = Bitmap.createBitmap(this.getDrawingCache()); 
     this.setDrawingCacheEnabled(false); 
     //image2 = BitmapFactory.decodeResource(getResources(), rid); 
     Log.w("DEBUG","which is null:image i " + i.getWidth() + " OR " +i.getDrawable().getIntrinsicHeight()); 
     Log.w("DEBUG","which is null:image h " + h.getWidth() + " OR " +h.getHeight()); 
     Log.w("DEBUG","which is null:image2 " + image2.getWidth() + " OR " +image2.getHeight()); 


     Log.w("DEBUG","which is null:image " + image.getWidth() + " OR " +image.getHeight()); 
     double bmWidth = image.getWidth(); 
      double bmHeight = image.getHeight(); 
      if (x < 0 || y < 0 || x > getWidth() || y > getHeight()){ 
       return 0; //Invalid, return 0 
       }else{ 
       //Convert touched x, y on View to on Bitmap 
       int xBm = (int)(x * (bmWidth/getWidth())); 
       int yBm = (int)(y * (bmHeight/getHeight())); 
       return image.getPixel(xBm, yBm); 
       } 
} 

지금 나에게 널 포인터 예외를 보여주는 것은

05-29 15:22:07.205: E/AndroidRuntime(889): FATAL EXCEPTION: main 
05-29 15:22:07.205: E/AndroidRuntime(889): java.lang.NullPointerException 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.graphics.Bitmap.createBitmap(Bitmap.java:358) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.example.nam.ImageIn.getmaskPixel(ImageIn.java:60) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.example.nam.AshActivity.getMaskColor(AshActivity.java:192) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.example.nam.FirstImage.pageinfo(FirstImage.java:102) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.example.nam.FirstImage.onTouch(FirstImage.java:65) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.View.dispatchTouchEvent(View.java:3762) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.os.Looper.loop(Looper.java:123) 
05-29 15:22:07.205: E/AndroidRuntime(889): at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-29 15:22:07.205: E/AndroidRuntime(889): at java.lang.reflect.Method.invokeNative(Native Method) 
05-29 15:22:07.205: E/AndroidRuntime(889): at java.lang.reflect.Method.invoke(Method.java:521) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-29 15:22:07.205: E/AndroidRuntime(889): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-29 15:22:07.205: E/AndroidRuntime(889): at dalvik.system.NativeStart.main(Native Method) 
+0

이 방법으로 문제가 있는지 확인 - http://stackoverflow.com/questions/8198291/bitmap-getwidth-returns-wrong-value – Shaiful

+0

당신이에서 onCreate (안쪽이 직접 일을) 또는 클릭 이벤트에서? –

+0

이벤트를 클릭하십시오 ..... – Ashishsingh

답변

1

당신은 단지 이미지 뷰의 이미지 캐시를 사용할 수 있습니다 . 새로운 비트 맵으로 레이아웃 (배율 조정, 배경과의 경계 설정) 될 때 전체보기를 렌더링합니다.

imageView.buildDrawingCache(); 
Bitmap bmap = imageView.getDrawingCache(); 

이 될 수있다 : 난 당신이에서 스케일 비트 맵을 만들려면 당신을 이해하는 경우

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 

More

또는 양식의 sdcard에 이미지

FileInputStream in = new FileInputStream("/sdcard/test2.png"); 
BufferedInputStream buf = new BufferedInputStream(in); 
byte[] bMapArray= new byte[buf.available()]; 
buf.read(bMapArray); 
Bitmap bMap = BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length 
+0

비트 맵에 sdcardimage에 대해 설명해 주시겠습니까 ..... 초보자이기 때문에이 점을 이해하는 데 더 도움이 될 수 있습니다 – Ashishsingh

+0

_lovers 오류를 표시하고 있습니다 .... 나는 그것을 업데이트했습니다. – Ashishsingh

0

을 비트 맵 another.Below는 비트 맵의 ​​크기를 조절할 수있는 코드 스 니펫입니다.

원래 비트 맵 개체와 원하는 비트 맵 크기를 입력하기 만하면이 메서드는 새로 크기가 조정 된 비트 맵!

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 

int width = bm.getWidth(); 

int height = bm.getHeight(); 

float scaleWidth = ((float) newWidth)/width; 

float scaleHeight = ((float) newHeight)/height; 

// create a matrix for the manipulation 

Matrix matrix = new Matrix(); 

// resize the bit map 

matrix.postScale(scaleWidth, scaleHeight); 

// recreate the new Bitmap 

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 

return resizedBitmap; 

} 

은 비트 맵 객체에 접촉 점

사용 Bitmap.getPixel (INT X, INT의 Y)의 픽셀 값을 얻으려면.

int pixelCol = bmp.getPixel(touchX,touchY); 

      int a = (pixelCol >>> 24) & 0xff; 
      int r = (pixelCol >>> 16) & 0xff; 
      int g = (pixelCol >>> 8) & 0xff; 
      int b = pixelCol & 0xff; 
+0

아무 친구도 작동하지 않습니다 ....... – Ashishsingh

+0

비트 맵의 ​​크기를 조정하고 싶습니까? * –

+0

기본적으로이 함수에서 원하는 것은 해당 픽셀에 대한 사용자 터치입니다. 픽셀 ....하지만 비트 맵으로 변환하면 높이가 커지지 만 폭은 정상입니다. – Ashishsingh

0

하면 자동 스케일을 해제하려고합니까 : 그것은 당신이 오른쪽으로 비트를 이동하여 별도의 A, R, G, B 값을 취할 필요 곳에서 int 값을 반환합니다?

Matrix matrix = new Matrix();    
BitmapFactory.Options bfoOptions = new BitmapFactory.Options(); 
//Set to UnAutoScale 
bfoOptions.inScaled = false; 
//Fit to your size 
matrix.setScale(widthRatio, heightRatio); 
Bitmap tempBitmap = BitmapFactory.decodeResource(res, resID, bfoOptions); 
Bitmap outputbitmap = Bitmap.createBitmap(tempBitmap, 0, 0, tempBitmap.getWidth(), tempBitmap.getHeight(), matrix, true); 
+0

오류 다음과 같은 오류 메시지가 표시됩니다. java.lang.IllegalArgumentException : 비트 맵 크기가 32 비트를 초과합니다. – Ashishsingh

관련 문제