2012-07-29 3 views
13

Wie bekomme ich eine Bitmap mit einer bestimmten (speicherfreundlichen) Größe von der Kamera?Größe der Bitmap, die von der Kamera über die Absicht zurückgegeben wird?

Ich beginne eine Kamera Absicht mit:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
cameraIntent.putExtra("return-data", true); 

photoUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "mytmpimg.jpg")); 
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);   

startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA); 

Griff ich das Ergebnis hier:

// Bitmap photo = (Bitmap) intent.getExtras().get("data"); 

Bitmap photo = getBitmap(photoUri); 

Nun, wenn ich die Kommentarzeile verwenden - direkt die Bitmap bekommen, habe ich immer ein 160 x 120 Bitmap, und das ist zu klein. Wenn ich es aus dem URI mit ein paar Standard-Sachen, die ich gefunden habe (Methode getBitmap), lade, lädt es eine 2560 x 1920 Bitmap (!) Und das verbraucht fast 20 mb Speicher.

Wie lade ich 480 x 800 (die gleiche Größe wie die Kameravorschau zeigt)?

Ohne die 2560 x 1920 in Arbeitsspeicher laden und herunterskalieren zu müssen.

+0

Hilft das? http://stackoverflow.com/questions/3331527/android-resize-a-large-bitmap-file-to-scaled-output-file –

+0

Wahrscheinlich, aber gibt es nicht einen Weg, nur zu bekommen, was ich auf dem Bildschirm sehe wenn du das Bild nimmst ...? Ich brauche nichts mehr. – Ixx

+0

Ben Rujils Link weist auf die beste Antwort hin, die ich kenne. Ihre Wahl ist im Wesentlichen entweder Thumbnail in Intent oder native Auflösung in Datei. Wenn Sie nicht möchten, dass die Kamera-App das Foto in einer niedrigeren Auflösung speichert, haben Sie die Wahl. – Sparky

Antwort

2

Hier ist, was ich gefunden habe, basierend auf einer Methode namens getBitmap() aus einer Schnittbibliothek, die aus alten Android-Version entfernt wurde. Ich habe einige Änderungen:

private Bitmap getBitmap(Uri uri, int width, int height) { 
    InputStream in = null; 
    try { 
     int IMAGE_MAX_SIZE = Math.max(width, height); 
     in = getContentResolver().openInputStream(uri); 

     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 

     BitmapFactory.decodeStream(in, null, o); 
     in.close(); 

     int scale = 1; 
     if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) { 
      scale = (int)Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE/(double) Math.max(o.outHeight, o.outWidth))/Math.log(0.5))); 
     } 

     //adjust sample size such that the image is bigger than the result 
     scale -= 1; 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     in = getContentResolver().openInputStream(uri); 
     Bitmap b = BitmapFactory.decodeStream(in, null, o2); 
     in.close(); 

     //scale bitmap to desired size 
     Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, width, height, false); 

     //free memory 
     b.recycle(); 

     return scaledBitmap; 

    } catch (FileNotFoundException e) { 
    } catch (IOException e) { 
    } 
    return null; 
} 

Was das bedeutet ist die Bitmap laden BitmapFactory.Options mit() + einige Stichprobengröße - auf diese Weise das Originalbild nicht in den Speicher geladen wird. Das Problem ist, dass die Stichprobengröße nur in Schritten funktioniert. Ich erhalte die "Min" -Probengröße für mein Bild unter Verwendung einiger mathematischer Daten, die ich kopiert habe - und subtrahiere 1, um die Stichprobengröße zu erhalten, die die Min. Ergibt. Bitmap größer als die Größe, die ich brauche.

Und dann, um die Bitmap mit genau der angeforderten Größe zu erhalten, normale Skalierung mit Bitmap.createScaledBitmap(b, width, height, false);. Unmittelbar danach recyceln Sie die größere Bitmap. Dies ist wichtig, weil zum Beispiel in meinem Fall, um 480 x 800 Bitmap zu erhalten, das größere Bitmap 1280 x 960 war und das 4,6 MB Speicher belegt.

Ein speicherfreundlicherer Weg wäre, scale nicht anzupassen, so dass ein kleineres Bitmap entsprechend der erforderlichen Größe skaliert wird. Dies verringert jedoch die Qualität des Bildes.

Verwandte Themen