Come disegnare un’immagine su un’altra immagine?

Ho un progetto Java che riguarda la simulazione della rete di traffico in una città casuale, sono riuscito a capire un modo per implementare questo progetto, quindi ho diviso ogni intersezione in una sezione che è fondamentalmente una class estesa di JPanel (chiamata Carrefour). . Tutto funziona bene finché non sono rimasto bloccato su come disegnare veicoli e farli passare attraverso le strade.

Quindi il mio problema è come disegnare un’immagine (immagine del veicolo) su un’altra immagine (strada)?

Se si tratta di Swing, quindi disegna l’immagine di sfondo in una BufferedImage. Mostra questa immagine bufferizzata in un metodo paintComponent di JComponent (come JPanel) utilizzando il metodo drawImage(...) Graphic e quindi disegna le immagini modificate su questo nello stesso metodo paintComponent. Non dimenticare di chiamare prima il metodo super.paintComponent(...) .

Si prega di notare che questa domanda è stata posta un po ‘qui e altrove, e come ci si aspetterebbe, ci sono molti esempi di questo genere di cose che potete trovare qui con un po’ di ricerca.

modificare
Tu chiedi:

Grazie, questo è il modo in cui disegno l’immagine originale (strada)

Ancora una volta, ImageIO.read(...) una BufferedImage per questo, probabilmente usando ImageIO.read(...) . Quindi devi disegnare questo nel metodo paintComponent(Graphics g) g.drawImage(...) per sovrascrivere usando g.drawImage(...) .

Per esempio…

 import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.*; import java.io.IOException; import java.net.MalformsdURLException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.*; @SuppressWarnings("serial") public class IntersectionImagePanel extends JPanel { private static final String INTERSECTION_LINK = "http://www.weinerlawoffice.com/" + "accident-diagram.jpg"; private BufferedImage intersectionImage; public IntersectionImagePanel() { URL imageUrl; try { imageUrl = new URL(INTERSECTION_LINK); intersectionImage = ImageIO.read(imageUrl ); } catch (MalformsdURLException e) { e.printStackTrace(); System.exit(-1); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (intersectionImage != null) { g.drawImage(intersectionImage, 0, 0, this); } } @Override public Dimension getPreferredSize() { if (intersectionImage != null) { int width = intersectionImage.getWidth(); int height = intersectionImage.getHeight(); return new Dimension(width , height ); } return super.getPreferredSize(); } private static void createAndShowGui() { IntersectionImagePanel mainPanel = new IntersectionImagePanel(); JFrame frame = new JFrame("IntersectionImage"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

Un altro approccio che non richiede l’estensione dei componenti.

inserisci la descrizione dell'immagine qui

 import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.Random; import java.net.URL; import javax.imageio.ImageIO; public class ImageOnImage { ImageOnImage(final BufferedImage bg, BufferedImage fg) { final BufferedImage scaled = new BufferedImage( fg.getWidth()/2,fg.getHeight()/2,BufferedImage.TYPE_INT_RGB); Graphics g = scaled.getGraphics(); g.drawImage(fg,0,0,scaled.getWidth(),scaled.getHeight(),null); g.dispose(); final int xMax = bg.getWidth()-scaled.getWidth(); final int yMax = bg.getHeight()-scaled.getHeight(); final JLabel label = new JLabel(new ImageIcon(bg)); ActionListener listener = new ActionListener() { Random random = new Random(); public void actionPerformsd(ActionEvent ae) { Graphics g = bg.getGraphics(); int x = random.nextInt(xMax); int y = random.nextInt(yMax); g.drawImage( scaled, x, y, null ); g.dispose(); label.repaint(); } }; Timer timer = new Timer(1200, listener); timer.start(); JOptionPane.showMessageDialog(null, label); } public static void main(String[] args) throws Exception { URL url1 = new URL("http://i.stack.imgur.com/lxthA.jpg"); final BufferedImage image1 = ImageIO.read(url1); URL url2 = new URL("http://i.stack.imgur.com/OVOg3.jpg"); final BufferedImage image2 = ImageIO.read(url2); //Create the frame on the event dispatching thread SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { new ImageOnImage(image2, image1); } }); } }