Android转换为位图崩溃

时间:2013-02-16 14:37:49

标签: android bitmap crash uri

好吧所以我应该制作一个Android应用程序,但由于某种原因,我无法将我的图片转换为位图图像。它是一个.png图像,当我尝试在我的代码中转换它时,我的应用程序只是崩溃,没有错误代码或什么也没有。我已经尝试了很多次修复它,但我在编程方面并不是那么好,我需要帮助,它只是不起作用。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                if (requestCode == FOTO_NEMEN && resultCode == RESULT_OK)
                {
                    final File file = temp;
                    try {
                        String urienzo = "file:///sdcard/DCIM/2013-01-30_13-27-28.png";
                        Uri uri = Uri.parse(urienzo);
                        Bitmap foto = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                        if (foto == null) {
                            Toast.makeText(this, Uri.fromFile(file).toString(), Toast.LENGTH_SHORT).show();
                            return;
                        }
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        foto.compress(Bitmap.CompressFormat.PNG, 0 , bos);
                        final byte[] bytes = bos.toByteArray();
                        bos.close();
                        AsyncTask<Void,Void,Void> taak = new AsyncTask<Void,Void,Void>() {
                            @Override
                            protected Void doInBackground(Void... params) {
                                stuurAfbeelding(bytes);
                                return null;
                            }   
                        };
                        taak.execute(null,null);
                    } catch (IOException e) {
                        Log.e("Snapper","Fout bij foto nemen: " + e);
                    }
                }
            }

每当我到达位图foto部分时,它都会崩溃我的应用程序而没有任何错误消息。 我的URI被硬编码的原因是因为我认为URI.fromfile给了我错误的URI,所以我想确定。现在它只是崩溃,我不知道我的代码有什么问题。有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

在我看来,你得到了一个outOfMemmoryError。

从uri获取位图你应该使用这样的东西:

public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{
    InputStream input = this.getContentResolver().openInputStream(uri);

    BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
    onlyBoundsOptions.inJustDecodeBounds = true;
    onlyBoundsOptions.inDither=true;//optional
    onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
    BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
    input.close();
    if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1))
        return null;

    int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;

    double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;

    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
    bitmapOptions.inDither=true;//optional
    bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
    input = this.getContentResolver().openInputStream(uri);
    Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
    input.close();
    return bitmap;
}

private static int getPowerOfTwoForSampleRatio(double ratio){
    int k = Integer.highestOneBit((int)Math.floor(ratio));
    if(k==0) return 1;
    else return k;
}

其中THUMBNAIL_SIZE是您希望获得的缩略图的大小。 所以,它工作正常,我在我的applications0

中使用此代码

链接How to get Bitmap from an Uri?

答案 1 :(得分:0)

你可以这样:

Bitmap image;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, stream);

并且从意图中获取它可以尝试这样的事情:

bitmap = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), intent.getData());
String path = getRealPathFromURI(context, intent.getData());
bitmap = scaleImage(imageView, path);

,其中

private String getRealPathFromURI(Context context, Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}

答案 2 :(得分:0)

我想它会崩溃,因为这不是你从文件中加载图像的方式。

代码比你正在尝试的代码简单得多:

Bitmap bmp = BitmapFactory.decodeFile(urienzo);

就是这样!请确保此路径正确,因为它看起来不正确。

另外,如果您正在加载大图像(例如4MP),它会因内存不足而崩溃,因为Bitmaps的想法是用来将屏幕上的东西放到目前高清到全高清分辨率的屏幕上。