为什么Bitmap.decodeFile()方法返回null?

时间:2016-08-05 10:53:03

标签: android bitmap bitmapfactory

我正在尝试将文件解码为这样的位图 -

 BitmapFactory.Options options = new BitmapFactory.Options();
    try {
        Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, options);
        cropImageView.setImageBitmap(bitmap);
        Log.d("Musik","bitmap - "+bitmap+" "+mCurrentPhotoPath);
    }
    catch (Exception e){
        Log.d("Musik",e.toString());
    }

我的mCurrentPhotoPath是

file:/storage/sdcard0/Android/data/com.example.iaugmentor.iaugmentortestvers/files/Pictures/JPEG_20160805_161105_478260200.jpg

我无法找到为什么它返回null并且也没有捕获异常。

请帮忙。提前谢谢。

为了清楚说明,让我先说明如何首先保存图像我首先创建一个File对象,然后捕获图像并将其保存在给定的Uri中 -

// Create the File where the photo should go
                    File photoFile = null;
                    try {
                        photoFile = createImageFile();
                    } catch (IOException ex) {
                        // Error occurred while creating the File

                    }

                    if (items[which].equals("Take Photo")) {

                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                        if(intent.resolveActivity(getPackageManager()) != null) {


                            // Continue only if the File was successfully created
                            if (photoFile != null) {
                                profilePicUri = FileProvider.getUriForFile(ApplicationContext.getAppContext(),
                                        "com.example.iaugmentor.iaugmentortestvers",
                                        photoFile);


                            }
                            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, profilePicUri);

                            try {
                                intent.putExtra("return-data", true);

                                startActivityForResult(intent, RESULT_LOAD_IMG);
                            } catch (ActivityNotFoundException e) {
                                e.printStackTrace();
                            }
                        }

createImageFile()方法就像这样`

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    return image;
}

然后我试图在变量 mCurrentPhotoPath

的帮助下从另一个活动中读取图像

2 个答案:

答案 0 :(得分:1)

createImageFile()方法中创建/保存filePath:mCurrentPhotoPath

File imageFile = new File(image.getAbsolutePath()); 

mCurrentPhotoPath = imageFile.toString();

答案 1 :(得分:1)

bitmap = BitmapFactory.decodeFile(capturedImageFilePath);

private static String filename;
public static Bitmap compressImage(String imageUri,Context mContext) {

    String filePath = getRealPathFromURI(imageUri,mContext);
    Bitmap scaledBitmap = null;

    BitmapFactory.Options options = new BitmapFactory.Options();

    // by setting this field as true, the actual bitmap pixels are not
    // loaded in the memory. Just the bounds are loaded. If
    // you try the use the bitmap here, you will get null.
    options.inJustDecodeBounds = true;
    Bitmap bmp = BitmapFactory.decodeFile(filePath, options);

    int actualHeight = options.outHeight;
    int actualWidth = options.outWidth;

    // max Height and width values of the compressed image is taken as
    // 816x612

    float maxHeight = 816.0f;
    float maxWidth = 612.0f;
    float imgRatio = actualWidth / actualHeight;
    float maxRatio = maxWidth / maxHeight;

    // width and height values are set maintaining the aspect ratio of the
    // image

    if (actualHeight > maxHeight || actualWidth > maxWidth) {
        if (imgRatio < maxRatio) {
            imgRatio = maxHeight / actualHeight;
            actualWidth = (int) (imgRatio * actualWidth);
            actualHeight = (int) maxHeight;
        } else if (imgRatio > maxRatio) {
            imgRatio = maxWidth / actualWidth;
            actualHeight = (int) (imgRatio * actualHeight);
            actualWidth = (int) maxWidth;
        } else {
            actualHeight = (int) maxHeight;
            actualWidth = (int) maxWidth;

        }
    }

    // setting inSampleSize value allows to load a scaled down version of
    // the original image

    options.inSampleSize = calculateInSampleSize(options, actualWidth,
            actualHeight);

    // inJustDecodeBounds set to false to load the actual bitmap
    options.inJustDecodeBounds = false;

    // this options allow android to claim the bitmap memory if it runs low
    // on memory
    options.inPurgeable = true;
    options.inInputShareable = true;
    options.inTempStorage = new byte[16 * 1024];

    try {
        // load the bitmap from its path
        bmp = BitmapFactory.decodeFile(filePath, options);
    } catch (OutOfMemoryError exception) {
        exception.printStackTrace();

    }
    try {
        scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,
                Bitmap.Config.ARGB_8888);
    } catch (OutOfMemoryError exception) {
        exception.printStackTrace();
    }

    float ratioX = actualWidth / (float) options.outWidth;
    float ratioY = actualHeight / (float) options.outHeight;
    float middleX = actualWidth / 2.0f;
    float middleY = actualHeight / 2.0f;

    Matrix scaleMatrix = new Matrix();
    scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

    Canvas canvas = new Canvas(scaledBitmap);
    canvas.setMatrix(scaleMatrix);
    canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2,
            middleY - bmp.getHeight() / 2, new Paint(
                    Paint.FILTER_BITMAP_FLAG));

    // check the rotation of the image and display it properly
    ExifInterface exif;
    try {
        exif = new ExifInterface(filePath);

        int orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION, 0);
        Log.d("EXIF", "Exif: " + orientation);
        Matrix matrix = new Matrix();
        if (orientation == 6) {
            matrix.postRotate(90);
            Log.d("EXIF", "Exif: " + orientation);
        } else if (orientation == 3) {
            matrix.postRotate(180);
            Log.d("EXIF", "Exif: " + orientation);
        } else if (orientation == 8) {
            matrix.postRotate(270);
            Log.d("EXIF", "Exif: " + orientation);
        }
        scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                true);
    } catch (IOException e) {
        e.printStackTrace();
    }

    FileOutputStream out = null;
    filename = getFilename();
    try {
        out = new FileOutputStream(filename);

        // write the compressed bitmap at the destination specified by
        // filename.
        //scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
        if(filePath.contains(".png") || filePath.contains(".PNG")){
            scaledBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        }else{
            scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);    
        }
        // ContentValues values = new ContentValues();
        //
        // values.put(Images.Media.DATE_TAKEN,
        // System.currentTimeMillis());
        // values.put(Images.Media.MIME_TYPE, "image/jpeg");
        // values.put(MediaStore.MediaColumns.DATA,filename);
        //
        // ((Activity)mContext).getContentResolver().insert(
        // Images.Media.EXTERNAL_CONTENT_URI, values);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    return new BitmapFactory().decodeFile(filename);

}

public String getCompressedBitmapFilePath() {
    return filename;
}