9
votes

Faites pivoter une image en Java

Je cherche à faire pivoter une image. J'ai un jinternalframe qui contient un jlabel . L'étiquette contient l'image. Une fois l'image tournée, j'ai besoin de redimensionner le cadre interne. Le code que j'ai fait pivoter actuellement l'image, mais il y a du noir autour des bords de l'image et il est désactivé. Toute suggestion sur la manière de résoudre ce problème? XXX


2 commentaires

En général, la rotation d'une image modifie la largeur et la hauteur (par rapport aux axes X et Y). Je suppose que cela contribue à être "éteint". J'ai dû résoudre ceci en calculant la nouvelle taille et en comptant. Quant aux bords noirs, il s'agit d'un cas assez commun où la fonction rotative ne fonctionne pas avec un canal alpha. Peut-être que cela aidera pour le positionnement: Stackoverflow.com/questions/2056338/...


Voir aussi Stackoverflow.com/Questtions/3420651


4 Réponses :


4
votes

Vous pouvez essayer d'utiliser un icône tournée .


1 commentaires

Merci, je vais devoir examiner cela.



0
votes

Aide-t-il si vous changez:

tamperedimage daimage = nouveau bufferedimage (hauteur, largeur, type);

à:

tamperedimage daimage = nouveau bufferedimage (** largeur, hauteur **, type); ?


1 commentaires

Oui, j'ai changé ces deux côtés, toujours pas de succès.



17
votes

Vous devez utiliser la trigonométrie pour déterminer la largeur / hauteur correcte, à l'aide de la transparence pour empêcher la zone noire et je pense que la transformation est fausse, ce qui le fait hors centre.

Essayez ceci: xxx

de http://flyingdogz.wordpress.com/2008/02/11/Image-rotate-in-java-2-Asier-a-Utilisation/


3 commentaires

C'est vraiment cool. J'ai un problème avec ça. Mon image n'a besoin que de faire pivoter 90 degrés. à la fois. Si je passe dans 90 pour angle, cela pivotera en fait plus de 90 degrés.


Cela utilise des radians, il suffit d'utiliser des maths.Toradians (degré) en premier.


Pouvons-nous nous débarrasser de la dépendance du périphérique d'écran?



1
votes

Basé sur un exemple précédent, mais travaillant réellement avec JDK récent et en mode sans tête:

public static BufferedImage rotate(BufferedImage image, double angle) {
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
    int w = image.getWidth(), h = image.getHeight();
    int neww = (int)Math.floor(w*cos+h*sin), newh = (int) Math.floor(h * cos + w * sin);
    BufferedImage result = deepCopy(image, false);
    Graphics2D g = result.createGraphics();
    g.translate((neww - w) / 2, (newh - h) / 2);
    g.rotate(angle, w / 2, h / 2);
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
}

public static BufferedImage deepCopy(BufferedImage bi, boolean copyPixels) {
    ColorModel cm = bi.getColorModel();
    boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
    WritableRaster raster = bi.getRaster().createCompatibleWritableRaster();
    if (copyPixels) {
        bi.copyData(raster);
    }
    return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}    


0 commentaires