2010-08-09 6 views
2

Tout en faisant tourner une image bitmap en utilisant la matrice, le sommet est pas stable ..Faire pivoter une image bitmap en utilisant la matrice

Matrix matrix = new Matrix(); 
    matrix.postRotate(mDegree,100,100); 
    mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(), mCompPic.getHeight(), matrix, true); 
    mCompassHud.setImageBitmap(mCompasstemp); 

sortie de mon code est comme -bitmap tournera. -vertex de mon bitmap n'est pas stable. -Bitmap redimensionne

Je dois désactiver le redimensionnement de l'image et rendre la rotation stable.Pouvez-vous proposer une solution pour cela?

Répondre

1

Je ne sais pas si c'est ce que vous cherchez, mais cela pourrait aider. Android utilise ses fonctions de compatibilité intégrées pour mettre à l'échelle et rendre un bitmap de manière appropriée pour les écrans ayant des densités de pixels différentes. Il existe deux méthodes de mise à l'échelle, de pré-mise à l'échelle et d'auto-mise à l'échelle.

Il va pré-dimensionner les bitmaps 'à partir des ressources et des échelles automatiques lorsque le bitmap est dessiné en interne (ce que vous faites en utilisant createBitmap).

Aller à http://developer.android.com/guide/practices/screens_support.html et vérifier sous: densité 4.Utilisez et/ou la taille spécifique des ressources: pré-mise à l'échelle et l'auto-mise à l'échelle des bitmaps et neuf patches

5

Plutôt que de créer votre nouvelle image directement à partir l'original, une autre option (plus directe, imho) est de créer le bitmap résultant, créer un canevas avec ce bitmap, puis faire votre rotation/translation/mise à l'échelle sur le canevas et dessiner le bitmap original sur le nouveau bitmap via le canevas .

Fondamentalement, vous êtes à la recherche, puis, à:

scaledImage = Bitmap.createBitmap (croppedWidth, croppedHeight, Bitmap.Config.ARGB_8888); 

    Canvas offscreenCanvas = new Canvas (scaledImage); 
    Matrix matrix = new Matrix(); 
    matrix.setRotate (rotations, centreX, centreY); 
    matrix.postScale(scaleX, scaleY); 
    offscreenCanvas.setMatrix (matrix); 

    offscreenCanvas.drawBitmap (pickedImage, 0, 0, new Paint(Paint.DITHER_FLAG)); 
+0

merci .. travaux parfaits .. –

1

J'ai essayé ce code, et la rotation est stable au centre du bitmap

matrix.reset(); 
matrix.setRotate(degree, Xpos+bitmap.getWidth()/2, Ypos+bitmap.getHeight()/2); 

puis en toile doDraw()

canvas.setMatrix(matrix);    
canvas.drawBitmap(bitmap, Xpos, Ypos, null); 
canvas.setMatrix(null); 

le Xpos et Ypos est la position X et Y de l'image bitmap Le setMatrix (null), définissez la matrice null, de sorte que la rotation n'a pas affecté l'après bitmap Et il ne crée pas toujours nouvelle image, il est donc idéal pour la performance J'espère que l'aide

+0

pouvez-vous poster votre code complet – baloo

0

I connaître son une vieille question, mais toutes les réponses avec le code impliquent une toile, de sorte Heres une solution sans une toile qui a fonctionné pour moi:

Matrix matrix = new Matrix(); 
matrix.postRotate(mDegree,100,100); 
mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(), 
    mCompPic.getHeight(), matrix, true); 

mCompasstemp = Bitmap.createScaledBitmap(mCompassTemp, mCompPic.getWidth(), 
    mCompic.getHeight(), false); 

mCompassHud.setImageBitmap(mCompasstemp); 

donc, fondamentalement, après avoir fait tourner votre bitmap redimensionnez à la taille désirée. Peut-être pas la meilleure pratique, mais au moins vous n'avez pas besoin de créer une toile supplémentaire si vous ne voulez pas/besoin, puisque l'objet Paint() impliquant n'est pas une opération peu coûteuse non plus.

Questions connexes