2017-05-20 5 views
2

J'avais cherché à ce sujet mais je n'ai pas obtenu de réponse directe. Je veux une image en mémoire tampon à rotation mais pas recadrée Je savais que les nouvelles dimensions va être quelque chose comme çaComment faire pivoter une image mise en mémoire tampon sans la rogner? Est-il possible de faire pivoter un JLayeredPane ou un JLabel?

int w = originalImage.getWidth(); 
int h = originalImage.getHeight(); 
double toRad = Math.toRadians(degree); 
int hPrime = (int) (w * Math.abs(Math.sin(toRad)) + h * Math.abs(Math.cos(toRad))); 
int wPrime = (int) (h * Math.abs(Math.sin(toRad)) + w * Math.abs(Math.cos(toRad))); 

Trouvez-moi une méthode pour cela.

BTW existe-t-il un moyen de faire pivoter un JLabel avec un ImageIcon?

Intention: ajouter aux panneaux et au volet en couches et également l'enregistrer dans un fichier (en sauvegardant le volet en couches).

Ou pouvons-nous faire pivoter le volet en couches?

+0

* "Comment faire tourner un tampon est-il possible de faire pivoter un Jlayeredpane ou Jlabel? "* Bien sûr, mais si l'image remplit toute la largeur et la hauteur, Les dimensions de l'image pivotée doivent être plus grandes. C'est une géométrie simple. –

+0

* "Intention: ajouter des panneaux et des volets et les enregistrer dans un fichier (en sauvegardant le panneau en couches)." * Cela n'explique vraiment pas pourquoi les images doivent être pivotées. Mais puisque vous l'avez mentionné, je ne recommanderais pas d'essayer de sérialiser les composants eux-mêmes.À moins de détails, j'aurais tendance à tout écrire (images pivotées incluses) pour agrandir l'image et sérialiser cette image plus grande. –

Répondre

0

BTW existe-t-il un moyen de faire pivoter un JLabel avec un ImageIcon?

La manière la plus simple est de faire pivoter l'icône, pas l'étiquette.

Extrayez Rotated Icon pour une classe effectuant la rotation et recalculant la taille de l'icône lors de la rotation. Intention: ajouter aux panneaux et au volet en couches et également l'enregistrer dans un fichier (en sauvegardant le volet en couches). Je ne sais pas exactement ce que cela signifie, mais si vous souhaitez simplement enregistrer une "image" du volet en couches, consultez Screen Image.

2

Comment faire pivoter une image mise en mémoire tampon sans la rogner?

Tu avais déjà la moitié du travail en calculant la taille de la rotation BufferedImage. L'autre moitié est en train de créer la rotation BufferedImage. Vous pouvez le faire en utilisant Graphics2D et en appliquant quelques transformations de coordonnées avant de dessiner l'image originale sur la nouvelle. En outre, il est logique de peindre la zone "en excès" avec une couleur de fond.

public BufferedImage rotateImage(BufferedImage originalImage, double degree) { 
    int w = originalImage.getWidth(); 
    int h = originalImage.getHeight(); 
    double toRad = Math.toRadians(degree); 
    int hPrime = (int) (w * Math.abs(Math.sin(toRad)) + h * Math.abs(Math.cos(toRad))); 
    int wPrime = (int) (h * Math.abs(Math.sin(toRad)) + w * Math.abs(Math.cos(toRad))); 

    BufferedImage rotatedImage = new BufferedImage(wPrime, hPrime, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = rotatedImage.createGraphics(); 
    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(0, 0, wPrime, hPrime); // fill entire area 
    g.translate(wPrime/2, hPrime/2); 
    g.rotate(toRad); 
    g.translate(-w/2, -h/2); 
    g.drawImage(originalImage, 0, 0, null); 
    g.dispose(); // release used resources before g is garbage-collected 
    return rotatedImage; 
} 

Voici un exemple de test du code ci-dessus:

Image originale
original

image pivotée (par 30 degrés)
rotated