Как нарисовать изображение поверх другого изображения?
У меня есть проект Java, посвященный моделированию сети трафика в случайном городе, мне удалось найти способ реализации этого проекта, поэтому я разделил каждое пересечение на раздел, который в основном представляет собой расширенный класс JPanel (названный Carrefour). Все работает хорошо, пока я не застрял в том, как рисовать транспортные средства и заставлять их проезжать через дороги.
Итак, моя проблема в том, как нарисовать изображение (изображение транспортного средства) поверх другого изображения (дороги)?
2 ответа
Если это Swing, тогда нарисуйте фоновое изображение в BufferedImage. Отобразите этот BufferedImage в методе paintComponent JComponent (например, в JPanel), используя Graphic's drawImage(...)
метод, а затем нарисуйте изменяющиеся изображения поверх этого в том же методе paintComponent. Не забудьте позвонить super.paintComponent(...)
Сначала метод хотя.
Обратите внимание, что этот вопрос задавался довольно часто здесь и в других местах, и, как и следовало ожидать, есть много примеров такого рода вещей, которые вы можете найти здесь с небольшим поиском.
редактировать
Ты спрашиваешь:
Спасибо, вот как я рисую первое изображение (дорога)
Опять же, вы бы создали BufferedImage для этого, вероятно, используя ImageIO.read(...)
, Тогда вы бы нарисовали это в своем JPanel's paintComponent(Graphics g)
переопределение метода с использованием g.drawImage(...)
,
Например...
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.*;
import java.io.IOException;
import java.net.MalformedURLException;
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 (MalformedURLException 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();
}
});
}
}
Другой подход, который не требует расширения компонентов.
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 actionPerformed(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("https://stackru.com/images/867e2425765f5a2445b8067d678a4b36004f010f.jpg");
final BufferedImage image1 = ImageIO.read(url1);
URL url2 = new URL("https://stackru.com/images/107c1d44b698c34cdc275fe040fc75f9769a7746.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);
}
});
}
}