在安卓上Bitmap.createBitmap空指针异常

问题描述 投票:0回答:2

我开发一个摄像头应用程序,我的问题是,在一些由相机拍摄的图像旋转,将其设置在一个ImageView的,所以我已经寻找一个解决方案,我发现从这个link.camera intent auto rotate to 90 degree的解决方案设备。我的问题是当我调用的方法,以产生旋转后的位图图像,它显示了以下行NPE

  Bitmap rotatedBitmap = Bitmap.createBitmap( bitencoded, 0, 0,  bitencoded.getWidth(),
            bitencoded.getHeight(), matrix, true);

全码

 private Bitmap rotateCam()
{
    Matrix matrix = new Matrix();
    matrix.postRotate(getImageOrientation(picturePath));

    Bitmap rotatedBitmap = Bitmap.createBitmap( bitencoded, 0, 0,  bitencoded.getWidth(),
            bitencoded.getHeight(), matrix, true);
    imageView.setImageBitmap(rotatedBitmap);
    return rotatedBitmap;
}

logcat的

java.lang.NullPointerException
        at project1.me.com.update.ImageUploadActivity.rotateCam(ImageUploadActivity.java:235)
        at project1.me.com.update.ImageUploadActivity.onCreate(ImageUploadActivity.java:182)
        at android.app.Activity.performCreate(Activity.java:5206)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
        at android.app.ActivityThread.access$700(ActivityThread.java:140)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4921)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
        at dalvik.system.NativeStart.main(Native Method)

的onCreate

 byte[] data = picturePath.getBytes("UTF-8");
          String base64PicPath = Base64.encodeToString(data, Base64.DEFAULT);

          bitencoded=  stringToBitMap(base64PicPath);
          try
          {
              rotateCam();
              Log.e(" Rotated", "Method  called");
          }
          catch(Exception e)
          {
            Log.e("Not Rotated","Method not called");
            e.printStackTrace();
            Log.e(e.getClass().getName(), e.getMessage(), e);
        }

getImageOrientation()

 public static int getImageOrientation(String imagePath){
    int rotate = 0;
    try {

        File imageFile = new File(imagePath);
        ExifInterface exif = new ExifInterface(
                imageFile.getAbsolutePath());
        int orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);

        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return rotate;
}

我是初学者,我找不到理由NPE.Can人帮助我吗?.Thanks提前。

android bitmap android-imageview android-orientation
2个回答
1
投票

使用这种方法来转换位图。

 private Bitmap decodeFile(String filePath) {

    // Decode image size
    try {

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        BitmapFactory.decodeFile(filePath, o);
        final int REQUIRED_SIZE = 1024;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        o.inJustDecodeBounds = false;

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        bitmap = BitmapFactory.decodeFile(filePath, o2);

    }
    catch (Exception e) {
        Log.e(e.getClass().getName(), e.getMessage(), e);
    }
   return bitmap;
}

和的onCreate():

bitmap = decodeFile(picturePath);
rotateCam();

坐落在rotateCam()的ImageView的:

public void rotateCam() {
    Matrix matrix = new Matrix();
    matrix.postRotate(getImageOrientation(picturePath));
    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
        bitmap.getWidth(),
        bitmap.getHeight(), matrix, true);
    imageView = (ImageView) findViewById(R.id.imgView);
    imageView.setImageBitmap(rotatedBitmap);
 }

0
投票
Bitmap bitencoded=null;
bitencode.getWidth();

您所呼叫的方法的getWidth()上bitencoded空引用。应该不是这样,

Bitmap bitencode = BitmapFactory.decodeResource(getResources(), R.drawable.yourBitmap);

然后,

bitencode.getWidth();
© www.soinside.com 2019 - 2024. All rights reserved.