2016-12-17 2 views
0

Ich mache gerade ein Spiel, das das Drehen eines Bildes erfordert. Um es zu drehen, verwende ich den folgenden Code.Ersetzen Sie nur die Ecken eines gedrehten Bildes durch eine andere Farbe

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); 
} 

Der Code dreht das Bild, aber es lässt die Ecken schwarz, die transparent sein sollten. Mein Renderer erkennt den rgb-Wert -1 als den transparenten Wert und ändert kein Pixel, wenn dieser Wert vorhanden ist. Also möchte ich die RGB-Werte der Ecken von 0 (schwarz) zu -1 (transparent) ändern.

Das einzige Problem ist, ich kann nicht einfach durch das Bild iterieren und die schwarzen Pixel ersetzen, weil es andere Pixel im Originalbild gibt, die schwarz sind. Meine Frage ist also, wie ich nur die schwarzen Pixel ersetze, die durch die Rotation entstehen.

(. Leider konnte ich keine Beispiele für das Bild zur Verfügung stellen, ich bin nicht sicher, wie mit diesem Computer Screenshot)

+0

Sie können versuchen, einen Algorithmus zu machen, dass sucht, gibt einen Punkt, alle Nachbarn mit der gleichen Farbe, und dann diese Nachbarn iterieren. Da die Ecken schwarz sind, sollten Sie, wenn Sie die Iteration in den vier Ecken beginnen, alle 4 schwarzen Bereiche erhalten. – ebeneditos

+0

Das ist auch nicht perfekt, da es an den Bildrändern schwarze Pixel geben könnte. –

+0

Rechts, sind die Ecken des gedrehten Originalbildes an den Rändern des neuen Bildes? – ebeneditos

Antwort

1

Das Grafikobjekt hat keinen Kontext, um diese neuen Pixel einzufärben, also färbt es sie einfach schwarz.

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

Sie sollten die folgende verwenden, so unterstützt die BufferedImage Transparenz:

BufferedImage.TYPE_INT_ARGB 

Dann in der Malerei Code können Sie verwenden:

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

Wenn ich richtig verstanden habe, haben Sie die folgende Rotation:

enter image description here

Die grünen Zellen sind das ursprüngliche Bild gedreht, während die weißen den Bereich, den Sie löschen möchten. Von der Rotation und den gegebenen Grad, können Sie die Koordinaten der roten Blutkörperchen kennen und somit löschen Zellen, die die Bedingungen erfüllen:

(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 geholfen!

+0

Ja, und ich vermute, diese Bedingungen würden für die anderen Ecken leicht verändert werden. Vielen Dank. Das sollte super funktionieren! –

+0

Ja! Nur mit den anderen Bedingungen bearbeitet! – ebeneditos

Verwandte Themen