Hoi allemaal,
Ik heb het volgende probleem.
Een BufferedImage, met daarop een tekening, is geplaatst op het canvas van een JPanel.
Middels de muis is de gebruiker in staat deze image te verplaatsen en te roteren. Ook kan hij het formaat van de image wijzigen.
Het wijzigen van het formaat betekent het wijzigen van de size van de image en de daarbij horende canvas (er zijn dus meer pixels; stel dat ik een rechthoek teken op het canvas van de BufferedImage, dan kan deze nu groter zijn). Het betreft dus geen AffineTransform.scale operatie (deze vergroot de BufferedImage).
Wanneer de gebruiker de image vergroot 'naar het noorden' en de image is niet geroteerd dan betekent dit dus dat het punt waar de image getekend wordt naar boven gaat en de totale hoogte van de image toeneemt. Dit werkt goed.
Roteren doe ik als volgt:
- Roteer de canvas middels een AffineTransform in het centrum van de image
- Teken de image
Als ik op deze manier de image roteer zodat de bovenkant van het plaatje naar beneden wijst, en de gebruiker probeert de image dan te resizen 'naar het noorden' (op het scherm is dit nu dus naar het zuiden) dan gaat het fout: omdat ik de origin van de image naar boven verplaats tekent hij nu de image te ver naar boven.
Ik zoek eigenlijk een manier om een BufferedImage te tekenen op een canvas en dáárna de viewport als het ware te roteren. Op die manier zou het volgens mij wel goed moeten gaan.
Onderstaand een sterk vereenvoudigd stuk voorbeeld code.
Er wordt een rechthoek getekend met een stip die de bovenkant aangeeft (op een BufferedImage dus). Door op 'R' te drukken roteert de rechthoek 90 graden en door op een van de pijltjestoetsen te drukken wordt de image groter.
Iemand enig idee hoe ik dit op kan lossen ?
Ik heb het volgende probleem.
Een BufferedImage, met daarop een tekening, is geplaatst op het canvas van een JPanel.
Middels de muis is de gebruiker in staat deze image te verplaatsen en te roteren. Ook kan hij het formaat van de image wijzigen.
Het wijzigen van het formaat betekent het wijzigen van de size van de image en de daarbij horende canvas (er zijn dus meer pixels; stel dat ik een rechthoek teken op het canvas van de BufferedImage, dan kan deze nu groter zijn). Het betreft dus geen AffineTransform.scale operatie (deze vergroot de BufferedImage).
Wanneer de gebruiker de image vergroot 'naar het noorden' en de image is niet geroteerd dan betekent dit dus dat het punt waar de image getekend wordt naar boven gaat en de totale hoogte van de image toeneemt. Dit werkt goed.
Roteren doe ik als volgt:
- Roteer de canvas middels een AffineTransform in het centrum van de image
- Teken de image
Als ik op deze manier de image roteer zodat de bovenkant van het plaatje naar beneden wijst, en de gebruiker probeert de image dan te resizen 'naar het noorden' (op het scherm is dit nu dus naar het zuiden) dan gaat het fout: omdat ik de origin van de image naar boven verplaats tekent hij nu de image te ver naar boven.
Ik zoek eigenlijk een manier om een BufferedImage te tekenen op een canvas en dáárna de viewport als het ware te roteren. Op die manier zou het volgens mij wel goed moeten gaan.
Onderstaand een sterk vereenvoudigd stuk voorbeeld code.
Er wordt een rechthoek getekend met een stip die de bovenkant aangeeft (op een BufferedImage dus). Door op 'R' te drukken roteert de rechthoek 90 graden en door op een van de pijltjestoetsen te drukken wordt de image groter.
Iemand enig idee hoe ik dit op kan lossen ?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; /***************************************************************************** * Creates a BufferedImage that displays a simple image. * * This Image will can be rotated 1/2 PI degrees by pressing 'R'. * By pressing any of the arrow-keys, the image is resized as if stretching * the top of the image. (i.e. in the original, non-rotated, image it * simply moves the origin of the image and increases the height). *****************************************************************************/ public class ImageTest extends JPanel implements KeyListener { double theta = 0.0; // rotation angle Point origin = new Point(50,50); // origin of the image Dimension size = new Dimension(100,100); // size of the image public static void main(String[] args) { JFrame mainFrame = new JFrame("Image Tester"); ImageTest imageTest = new ImageTest(); mainFrame.getContentPane().add(imageTest); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setSize(400,400); mainFrame.show(); mainFrame.addKeyListener(imageTest); } // draw the image on the JPanel public void paintComponent(Graphics g) { super.paintComponent(g); // create a BufferedImage and draw something on it (a rectangle) BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB); Graphics g2 = image.createGraphics(); g2.drawRect(0, 0, size.width - 1, size.height - 1); g2.fillOval(size.width / 2, 0, 3, 3); // draw a little 'north' indicator g2.dispose(); // now rotate g Graphics2D g2d = (Graphics2D)g; g2d.rotate(theta, origin.x + size.width / 2.0, origin.y + size.height / 2.0); // and draw the image on the specified origin g2d.drawImage(image, origin.x, origin.y, null); } /******************************************************************************* * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent) *******************************************************************************/ public void keyPressed(KeyEvent arg0) { switch(arg0.getKeyCode()) { case (KeyEvent.VK_R): // rotate! add 1 / 2 PI degrees of rotation theta += Math.PI / 2; repaint(); break; case (KeyEvent.VK_LEFT): case (KeyEvent.VK_RIGHT): case (KeyEvent.VK_DOWN): case (KeyEvent.VK_UP): // make the image 5 pixels larger origin.y = origin.y - 5; size.height += 5; repaint(); break; } } /******************************************************************************* * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent) *******************************************************************************/ public void keyReleased(KeyEvent arg0) {} /******************************************************************************* * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent) *******************************************************************************/ public void keyTyped(KeyEvent arg0) {} } |