2012-09-27 3 views
1

J'essaie d'afficher un bitmap sur le canevas en utilisant la matrice.Android Canvas drawBitmap fonction efficacité

 canvas.drawBitmap(currentBitmap, m_matrix, tempPaint); 

mais le résultat apparaît, l'image semble étrange. Après cela, je l'ai montré en utilisant des limites

 canvas.drawBitmap(currentBitmap, 0, 0, tempPaint); 

Mais ici l'image semble bien, dans les deux cas l'image n'est pas mise à l'échelle.

Comment définir les propriétés de la matrice pour l'affichage initial? L'affichage de la matrice utilise-t-il quelque chose d'autre pour montrer l'image en raison de cette image qui est changée?

Veuillez suggérer des tutoriels pour plus de détails.

Répondre

0

Vous devez utiliser Matrix. afficher l'échelle pour redimensionner l'image, comme dans l'exemple ci-dessous.

drawMatrix private void() {

matrice Matrix = new Matrix(); matrix.postScale (curScale, curScale);

canvas.drawBitmap(currentBitmap, matrix, tempPaint);} 

N'a pas essayé encore .... mais devrait fonctionner ...

+0

je l'ai déjà essayé bitmap reseting en utilisant matrix.postScale (1f, 1f) ou martix.setValues ​​(IDENTITY_MATRIX3X3), mais aucun d'entre eux working.Still bitmap apparaît d'abord bizarre. – strike

0

Après beaucoup de recherche beaucoup j'ai enfin trouvé la solution, certains des fils liés à la même question m'a aidé .

Quality Issue

Quality problems when resizing an image at runtime

J'ai suivi pour le chargement du bitmap didacticiels de Google et écrit ma propre fonction mise à l'échelle du bitmap.

public static Bitmap scaleDownBitmap(Bitmap original, boolean recycleOriginal, int newmaxWidth , int newmaxHeight){ 

     if(original == null) 
      return null; 

     Bitmap rtr= null; 
     try{ 

       int origWidth = original.getWidth(); 
       int origHeight = original.getHeight(); 


       if(origWidth <= newmaxWidth && origHeight <= newmaxWidth){ 
         Bitmap b = Bitmap.createBitmap(original); 
         if (recycleOriginal && (original != b)) 
          original.recycle(); 
        return b; 
       } 

       int newWidth = 0; 
       int newHeight = 0; 

       float ratio; 

       if(origWidth > origHeight){ 
         ratio = (float)origWidth/(float)origHeight; 
         newWidth = newmaxWidth; 
         newHeight = (int)((float)newWidth/ratio); 

       } 
       else{ 
         ratio = (float)origHeight/(float)origWidth; 
         newHeight = newmaxHeight; 
         newWidth = (int)((float)newHeight/ratio); 
       } 

       rtr = CreateScaledBitmap(original , newWidth , newHeight); 

       if(recycleOriginal && original != rtr) 
         original.recycle(); 

     } 
     catch (Exception e) { 
      Log.d("Image Compress Error", e.getMessage()); 
     } 

     return rtr; 

} 

    public static Bitmap CreateScaledBitmap(Bitmap paramBitmap, int paramInt1, int paramInt2) 
    { 
     Bitmap localBitmap = Bitmap.createBitmap(paramInt1, paramInt2, paramBitmap.getConfig()); 
     Canvas localCanvas = new Canvas(localBitmap); 
     localCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, 2)); 
     localCanvas.drawBitmap(paramBitmap, new Rect(0, 0, paramBitmap.getWidth(), paramBitmap.getHeight()), 
              new Rect(0, 0, paramInt1, paramInt2), null); 
    return localBitmap; 
} 

Maintenant, après avoir obtenu l'image, j'ai passé les paramètres suivants à la peinture.

tempPaint.setFilterBitmap(true); //Line 1 
canvas.drawBitmap(currentBitmap, m_matrix, tempPaint);