2011-12-16 4 views
3

J'ai peu de questions sur la gestion des grandes bitmaps, je ne pouvais pas trouver de réponse sur les sujets que j'ai trouvé où ce problème a été discuté jusqu'à présent.Application Appareil photo Android - Grande manipulation bitmap

J'ai un Nexus S qui, lorsque je prends une image avec la classe hardware.Camera comme ceci:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); 
     } 
    } 
}; 

Ayant à l'esprit que l'image est 5MPixels, l'application au point des accidents de decodeByteArray. Donc, je pensais, si cela se bloque alors comment cela se fait dans l'application Appareil photo d'Android.

J'ai téléchargé la source et là, je trouve la méthode makeBitmap là: http://www.java2s.com/Open-Source/Android/android-platform-apps/Gallery/com/android/camera/Util.java.htm

Alors j'ai changé mon rappel à utiliser makeBitmap:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      Bitmap bitmap = Utils.makeBitmap(imageData, 50 * 1024); 
     } 
    } 
}; 

Je pris cette méthode et utilisé dans mon application. Non seulement que l'image que je crée avec cette méthode est de mauvaise qualité, mais aussi si j'augmente le nombre de pixels (50 * 1024), j'aurai un autre problème avec OutOfMemory. Donc, ma question serait, si je veux utiliser de gros bitmaps, et en gros je veux dire un PNG avec des couches alpha d'environ 500x300, comment puis-je le faire? Comment se fait la création de la grande image dans l'application Appareil photo Android?

Merci!

+1

Quelle était la cause de l'incident? S'il vous plaît fournir starttrace/logcat. Et votre lien source semble être incorrect - Il n'y a pas de méthode makeBItmap() avec cette signature –

Répondre

0

Vous ne serez pas en mesure d'adapter cette grande partie d'un bitmap en mémoire pour l'affichage.

Mais vous pouvez enregistrer le bitmap:

byte[] imageData; 
FileOutputStream out = new FileOutputStream(file); 
out.write(imageData, 0, imageData.length); 
out.flush(); 
out.close(); 

Et charge plus tard dans une version sous-échantillonnée pour l'affichage.

FileInputStream inputStream = new FileInputStream(file); 
BitmapFactory.decodeStream(inputStream, null, options); 

De cette façon, vous conservez l'image d'origine, tout en continuant à afficher l'image sans débordement.

Remarque: Vous devrez utiliser des options pour spécifier la valeur de sous-échantillonnage. Vous pouvez placer ceci dans un bloc try {} catch {} et une boucle qui incrémente le sous-échantillonnage si vous n'êtes pas sûr du montant dont vous aurez besoin.

0

il y a deux choses que vous pouvez essayer de libérer de la mémoire, mais il sera finalement venu à la taille du bitmap malheureusement

une chose que vous pouvez faire est de définir imageData à null après décodage

Questions connexes