2016-12-17 4 views
0

Je suis en train de créer un jeu qui nécessite la rotation d'une image. Pour le faire pivoter, j'utilise le code suivant.Remplace uniquement les coins d'une image pivotée par une couleur différente

public ManipulableImage rotate(double degrees){ 
    BufferedImage rotatedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = rotatedImage.createGraphics(); 
    g.rotate(Math.toRadians(degrees), image.getWidth()/2, image.getHeight()/2); 
    /* 
    ManipulableImage is a custom class that makes it easier to manipulate 
    an image code wise. 
    */ 
    g.drawImage(image, 0, 0, null); 
    return new ManipulableImage(rotatedImage, true).replace(0, -1); 
} 

Le code fait pivoter l'image, mais il laisse les coins noirs qui doivent être transparents. Mon moteur de rendu reconnaît la valeur rgb -1 comme valeur transparente et ne modifie pas un pixel lorsque cette valeur est présente. Donc, je voudrais changer les valeurs rgb des coins de 0 (noir) à -1 (transparent). Le seul problème est, je ne peux pas simplement parcourir l'image et remplacer les pixels noirs car il y a d'autres pixels dans l'image originale qui sont noirs. Donc ma question est, comment puis-je remplacer seulement les pixels noirs créés par la rotation.

(. Désolé, je ne pouvais pas donner des exemples de l'image, je ne suis pas sûr de savoir comment capture d'écran avec cet ordinateur)

+0

Vous pouvez essayer de faire un algorithme recherche, donné un point, tous les voisins de la même couleur, puis itérer ces voisins. Comme les coins sont noirs, si vous commencez l'itération dans les quatre coins, il devrait obtenir toutes les 4 zones noires. – ebeneditos

+0

Ce n'est pas parfait non plus, étant donné qu'il pourrait y avoir des pixels noirs sur les bords de l'image. –

+0

A droite, les coins de l'image originale pivotée sur les bords de la nouvelle image? – ebeneditos

Répondre

1

L'objet graphique n'a pas de contexte pour colorer ces nouveaux pixels, il les colorie simplement en noir.

BufferedImage rotatedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); 

Vous devez utiliser les éléments suivants de sorte que le BufferedImage soutient la transparence:

BufferedImage.TYPE_INT_ARGB 

Puis dans le code de la peinture, vous pouvez utiliser:

g.setColor(new Color(0, 0, 0, 0)); 
g.fillRect(0, 0, image.getWidth(), image.getHeight()); 
g.rotate(...); 
g.drawImage(...); 
0

Si je comprends bien, vous avez la rotation suivante:

enter image description here

Les cellules vertes sont l'image originale pivotée, tandis que les blanches correspondent à la zone que vous souhaitez supprimer. De la rotation et les degrés donné, vous pouvez connaître les coordonnées des globules rouges et donc, supprimer des cellules qui répondent aux conditions suivantes:

(x_coord <= x1 and y_coord > x_coord * y1/x1) /* Top Left */ or 
(x_coord >= x2 and y_coord > x_coord * y2/x2) /* Top Right */ or 
(x_coord >= x3 and y_coord < x_coord * y3/x3) /* Bottom Right */ or 
(x_coord <= x4 and y_coord < x_coord * y4/x4) /* Bottom Left */ 

Hope this aidé!

+0

Oui, et je devine que ces conditions seraient légèrement modifiées pour les autres virages. Merci. Cela devrait fonctionner très bien! –

+0

Oui! Juste édité avec les autres conditions! – ebeneditos