2012-07-29 17 views
13

Fotoğraf makinesinden belirli (bellek dostu) boyutta bir bitmapi nasıl alabilirim?Fotoğraf makinesiyle gönderilen bit eşlemin boyutu amaç tarafından mı?

Ben bir kamera niyet başlıyorum:

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); 

Burada sonucu işlemek: Artık

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

Bitmap photo = getBitmap(photoUri); 

ben yorumladı çizgi kullanırsanız - doğrudan bit eşlem almak, hep bir olsun 160 x 120 bitmap ve bu çok küçük. Ben bulduğum bazı standart şeyler kullanarak URI'dan yüklerseniz (method getBitmap), 2560 x 1920 bitmap (!) Yükler ve neredeyse 20 mb bellek tüketir.

nasıl en (kamera önizleme bana gösteriyor aynı boyut) 480 x 800 diyelim yüklerim? belleğe 2560 x 1920 yüklemek zorunda ve kireç oluşumu olmadan

. İşte

+0

Bu yardımcı olur mu? http://stackoverflow.com/questions/3331527/android-resize-a-large-bitmap-file-to-scaled-output-file –

+0

Muhtemelen, ancak ekranda gördüğüm şeyi elde etmenin bir yolu yoktur. pic çekerken ... Daha fazla bir şeye ihtiyacım yok. – Ixx

+0

Ben Rujil'in bağlantısı, bildiğim en iyi cevaba işaret ediyor. Seçiminiz temel olarak Niyet'deki küçük resim veya Dosya'daki doğal çözünürlükte fotoğraftır. Fotoğrafı daha düşük bir çözünürlükte kaydetmek için kamera uygulamasını alma, bu sizin seçiminizdir. – Sparky

cevap

2

eski Android sürümü kaldırılan bir mahsul kitaplığından getBitmap() adında bir yöntemine dayalı, ile geldi budur. Orijinal görüntü belleğe yüklü değil bu şekilde - Ne yapar BitmapFactory.Options kullanarak bitmap() + bazı örnek boyutunu yük olduğunu

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; 
} 

: Ben bazı değişiklikler yaptı. Sorun, örneklem büyüklüğünün sadece adımlarla çalıştığıdır. Ben kopyalamak bazı matematik kullanarak benim görüntü için "min" örnek boyutu almak - ve min üretecek örnek boyutunu elde etmek için 1 çıkarır. İhtiyacım olan boyuttan daha büyük bitmap.

Sonra istenen tam boyutu ile bitmap almak için

Bitmap.createScaledBitmap(b, width, height, false); normal ölçeklendirme yapmak. Ve hemen ardından daha büyük bitmap'i geri dönüştürüyor. Bu önemlidir, çünkü örneğin, benim durumumda, 480 x 800 bitmap elde etmek için, daha büyük bitmap 1280 x 960'dı ve 4.6mb bellek kaplar. böylece daha küçük bir bitmap yaygınlaştırılacaktır scale ayarlayamaz dost bir yol olacağını

Daha bellek, gerekli boyutuna uyacak şekilde. Ancak bu, görüntünün kalitesini azaltacaktır.

İlgili konular