2012-06-25 3 views
2

Je veux juste ouvrir une application de caméra native à partir de mon application pour capturer une photo et la définir comme image d'arrière-plan de mon écran, puis la faire tourner en cliquant sur le bouton. La photo tourne n nombre de fois si elle est prise avec un appareil photo 3MP. Si je règle la résolution de l'appareil photo à 5MP ou plus, l'application se ferme en appuyant sur le bouton 5 fois (la photo tourne 4 fois).Gestion de gros bitmap en android

Bitmap rotatedBitmap = null; 
int curAngle = 0; 

private Bitmap rotateImageBitmap(Bitmap capturedPhotoBitmap) {  

if(rotatedBitmap != null ) 
{ 
    rotatedBitmap = null; 
} 

Matrix matrix = new Matrix(); 
curAngle = (curAngle + 90) % 360; 
matrix.postRotate(curAngle); 
rotatedBitmap = Bitmap.createBitmap(capturedPhotoBitmap, 0, 0, capturedPhotoBitmap.getWidth(), capturedPhotoBitmap.getHeight(), matrix, true); 

return rotatedBitmap;   
} 

Ceci est du Guide du développeur ....
1. Les appareils mobiles ont généralement limité les ressources système. Les appareils Android peuvent avoir jusqu'à 16 Mo de mémoire disponible pour une seule application.

2. Les bitmaps occupent beaucoup de mémoire, en particulier pour les images riches comme les photographies. Par exemple, l'appareil photo sur le Galaxy Nexus prend des photos jusqu'à 2592x1936 pixels (5 mégapixels). Si la configuration bitmap utilisée est ARGB_8888 (la configuration par défaut à partir d'Android 2.3), le chargement de cette image en mémoire prend environ 19 Mo de mémoire (2592 * 1936 * 4 octets), épuisant immédiatement la limite par application sur certains périphériques.

La plupart des téléphones ont de nos jours des caméras de 8 mégapixels ou plus. donc les images seront grandes. Comment puis-je faire pivoter la photo «n» nombre de fois sans déranger la résolution de l'appareil photo. Ai-je besoin de le compresser? Quel est le meilleur moyen? Aidez-moi, s'il vous plaît.

Répondre

0

Plutôt que d'avoir l'image sur le tas dans la RAM, je voudrais charger (lire: buffer) l'image sur le disque dans le répertoire de cache de votre application. Une fois l'image sur le disque, je la gonfle ensuite en mémoire en utilisant une taille d'échantillon pour réduire la consommation de mémoire.

Voir http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize et http://developer.android.com/reference/android/graphics/BitmapFactory.html

La taille de l'échantillon vous choisissez est relatif à la taille de l'image bitmap (en pixels) et la taille de la vue que vous chargement de l'image à (en pixels).

Pour trouver les dimensions de l'image, utilisez l'option "inJustDecodeBounds" dans l'objet BitmapFactory.Options. Rappelez-vous que la taille de l'échantillon que vous choisissez doit être une puissance de 2. Plus le nombre est élevé, plus vous économisez de mémoire, mais plus la qualité de l'image est faible.

Taille de l'échantillon 2 = 1/4 de la taille. Taille de l'échantillon 4 = 1/16 la taille, etc.