Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Problème Canvas et densité

    15 avril 2012 à 15:57:16

    Bonjour a tous,

    Tout d'abord voici mon code:

    Bitmap carte = BitmapFactory.decodeResource(getResources(), R.drawable.cartepark);
    Log.d("affiche map","bitmap cree");
    Canvas c = new Canvas(carte); 
    Log.d("affiche map","canvas cree");
    chemin(carPosi,yourPosi,c);
    


    Le problème :

    Il s’exécute bien sur des écrans density:high mais pour les autres, il ne passe pas la ligne de creation du canvas .

    je me retrouve avec ces erreurs dans le log :

    04-15 13:37:18.634: E/AndroidRuntime(216): Uncaught handler: thread main exiting due to uncaught exception
    04-15 13:37:18.654: E/AndroidRuntime(216): java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
    04-15 13:37:18.654: E/AndroidRuntime(216): at android.graphics.Canvas.<init>(Canvas.java:83)
    ...


    j'ai bien essayé de faire :

    BitmapFactory.Options opt =new BitmapFactory.Options();
    opt.inMutable=true;
    Bitmap carte= BitmapFactory.decodeResource(getResources(),R.drawable.cartepark,opt);
    


    Mais éclipse ne veut pas reconnaître inMutable , j'ai pourtant vérifie dans la doc android. Puis je comprend pas pourquoi cela fonctionne sur les autres écrans si l'erreur viens de la.

    Merci d'avance pour vos idées ou vos suggestions.
    • Partager sur Facebook
    • Partager sur Twitter
      15 avril 2012 à 17:36:08

      Bonjour,

      Il faut essayer de créer une copie de ta bitmap et la passer au Canvas.

      Bitmap carte = BitmapFactory.decodeResource(getResources(), R.drawable.cartepark);
      carte = carte.copy(carte.getConfig(), true);
      Canvas c = new Canvas(carte);
      


      La signature de la fonction copy(): public Bitmap copy (Bitmap.Config config, boolean isMutable)
      La doc associée: http://developer.android.com/reference [...] %20boolean%29
      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2012 à 18:16:34

        Merci beaucoup.

        Ça marche super bien maintenant.
        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2012 à 8:17:21

          Bonjour,

          Je reviens sur mon sujet car je me retrouve avec un problème.

          La solution qui m'a été donner ici marchait très bien avec un image assez petite mais si je prend une image plus grande je me retrouve avec ce log :

          05-17 05:29:03.388: D/dalvikvm(474): GC_EXTERNAL_ALLOC freed 199K, 52% free 2632K/5447K, external 1823K/2137K, paused 41ms
          05-17 05:29:03.968: D/affiche map(474): bitmap load
          05-17 05:29:04.008: D/dalvikvm(474): GC_EXTERNAL_ALLOC freed 15K, 52% free 2619K/5447K, external 10628K/12660K, paused 45ms

          05-17 05:29:04.088: E/dalvikvm-heap(474): 9000000-byte external allocation too large for this process.
          05-17 05:29:04.188: E/GraphicsJNI(474): VM won't let us allocate 9000000 bytes

          05-17 05:29:04.188: D/dalvikvm(474): GC_FOR_MALLOC freed <1K, 52% free 2618K/5447K, external 10628K/12660K, paused 29ms
          05-17 05:29:04.188: D/AndroidRuntime(474): Shutting down VM

          05-17 05:29:04.198: W/dalvikvm(474): threadid=1: thread exiting with uncaught exception (group=0x40015560)
          05-17 05:29:04.208: E/AndroidRuntime(474): FATAL EXCEPTION: main
          05-17 05:29:04.208: E/AndroidRuntime(474): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.graphics.Bitmap.nativeCopy(Native Method)
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.graphics.Bitmap.copy(Bitmap.java:315)
          05-17 05:29:04.208: E/AndroidRuntime(474): at ttu.projet.parkassist.MapActivity.onCreate(MapActivity.java:49)
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
          05-17 05:29:04.208: E/AndroidRuntime(474): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)


          Donc je me retrouve avec un problème de mémoire, enfin si j'ai bien compris, pourtant je ne pense pas que juste deux images (l'original et la copie) prennent autant de mémoire si ?

          Pour information mon image cartepark.jpg fait 182 Ko et a une taille de 1500x1500

          Edit :

          Bon j'ai réussi a afficher mon image, grâce a un post trouvé plus bas, c'est pas exactement ce que je voulais mais sa me convient.

          Je redimensionne mon image pour quel soit plus petite.
          • Partager sur Facebook
          • Partager sur Twitter

          [Android] Problème Canvas et densité

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown