2016-04-24 14 views
1

私はjava android studioで初めてです。現在、カメラからバイナリにイメージを変換するプロジェクトを行っています。私はこのリンク(Android: Convert Grayscale to Binary Image)からすべてのステップを踏んだ。その後、実行時の問題はこのリンク(Android : Converting imageview to bitmap, to grayscale, bitmap to imageview)と同じでした。私は問題を解決したが、私のデバイス上で実行することはできません、それは通知を表示する残念なことにアプリケーションが停止しました。 logcatを示した:Java Androidスタジオ:画像をカメラからバイナリに変換する

04-24 16:46:18.573 22890-22890/? I/art: Late-enabling -Xcheck:jni 
04-24 16:46:18.813 22890-22890/com.example.gabriel.image D/AndroidRuntime: Shutting down VM 
04-24 16:46:18.823 22890-22890/com.example.gabriel.image E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.gabriel.image, PID: 22890 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.gabriel.image/com.example.gabriel.image.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2303) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
at android.app.ActivityThread.access$800(ActivityThread.java:147) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5234) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference 
at com.example.gabriel.image.MainActivity.onCreate(MainActivity.java:36) 
at android.app.Activity.performCreate(Activity.java:5984) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2256) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)  
at android.app.ActivityThread.access$800(ActivityThread.java:147)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:135)  
at android.app.ActivityThread.main(ActivityThread.java:5234)  
at java.lang.reflect.Method.invoke(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:372)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 

そしてここでは、私の完全なコーディングです:

public static final int REQUEST_CAPTURE = 1; 
ImageView result_photo; 
Button Binary; 

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

    Button click = (Button) findViewById(R.id.BCapture); 
    result_photo = (ImageView) findViewById(R.id.imageView); 
    Binary = (Button) findViewById(R.id.btnBinary); 

    BitmapDrawable drawable = (BitmapDrawable) result_photo.getDrawable(); 
    final Bitmap result_photoBitmap = drawable.getBitmap(); 

    Binary.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      //convert bitmap to grayscale 
      Bitmap result_photoNew; 
      result_photoNew = toGrayscale(result_photoBitmap); 
      //Convert to Binary 
      result_photoNew = toBinary(result_photoNew); 

      //convert bitmap to imageview 
      ImageView img_binary; 
      img_binary = (ImageView) findViewById(R.id.imageView2); 
      img_binary.setImageBitmap(result_photoNew); 
     } 
    }); 

    if (!hasCamera()) { 
     click.setEnabled(false); 
    } 


} 

public boolean hasCamera() { 
    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY); 
} 

public void launchCamera(View v) { 
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i, REQUEST_CAPTURE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_CAPTURE && resultCode == RESULT_OK) { 


     Bundle extras = data.getExtras(); 
     Bitmap photo = (Bitmap) extras.get("data"); 
     getResizedBitmap(photo, 120, 120); 
     result_photo.setImageBitmap(photo); 

    } 
} 

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; 

} 

public Bitmap toGrayscale(Bitmap bmpOriginal){ 
    int width, height; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
    Canvas c = new Canvas(bmpGrayscale); 
    Paint paint = new Paint(); 
    ColorMatrix cm = new ColorMatrix(); 
    cm.setSaturation(0); 
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
    paint.setColorFilter(f); 
    c.drawBitmap(bmpOriginal, 0, 0, paint); 
    return bmpGrayscale; 
} 


public Bitmap toBinary(Bitmap bmpOriginal) { 
    int width, height, threshold; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 
    threshold = 127; 
    //final Bitmap bmpBinary = null; 
    Bitmap bmpBinary = Bitmap.createBitmap(bmpOriginal); 

    for(int x = 0; x < width; ++x) { 
     for(int y = 0; y < height; ++y) { 
      // get one pixel color 
      int pixel = bmpOriginal.getPixel(x, y); 
      int red = Color.red(pixel); 
      int green = Color.green(pixel); 
      int blue = Color.blue(pixel); 

      //get grayscale value 
      int gray = (int)(red * 0.3 + green * 0.59 + blue *0.11); 

      //get binary value 
      if(gray < threshold){ 
       bmpBinary.setPixel(x, y, 0xFF000000); 
      } else{ 
       bmpBinary.setPixel(x, y, 0xFFFFFFFF); 
      } 

     } 
    } 
    return bmpBinary; 
} 

plzは私を助けて。

+0

activity_main.xmlコードも追加してください – USKMobility

+0

問題はAndroid Studio IDE自体に関連するものではなく、一般的なAndroidプログラミングに関するものであるため、タイトルまたは「android-studio」タグに「Android Studio」は必要ありません。 –

+0

result_photoがnullの場合、IDがレイアウトXML IDと一致するかどうかを確認してください。また、あなたのサイズ変更ビットマップメソッドはビットマップオブジェクトを返しますが、それを呼び出すときに返されるビットマップに座っていません。 – seanAshmore

答えて

0

あなたの問題は、このライン

BitmapDrawable drawable = (BitmapDrawable) result_photo.getDrawable(); 

あなたはNullPointerExceptionがありますここで、その後

final Bitmap result_photoBitmap = drawable.getBitmap(); 

をnullを返すとされていることです。 私はあなたがnullになっている理由を推測する必要がある場合、私はあなたのactivity_main.xmlimageViewは次のように挿入描画可能持っていることを言うと思います:

android:background="@drawable/mydrawable" 

をしかし、それは次のようにする必要があります:

android:src="@drawable/mydrawable" 

getDrawable()で入手するには、代わりにgetBackground()に電話する必要があります。

関連する問題