java - 在java中加载的图像上绘制对象
问题描述
我需要帮助来加载地图图像并在接收到的位置上绘制一个点。这是服务器的代码:
import java.awt.Dimension;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Server extends JFrame{
private static int PACKETSIZE = 100 ;
private static int WIDTH = 1340;
private static int HEIGHT = 613;
public DatagramSocket socket;
public DrawPoint drawPoint;
public Server() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
drawPoint = new DrawPoint();
drawPoint.setPreferredSize(new Dimension(WIDTH, HEIGHT));
add(drawPoint);
pack();
setVisible(true);
}
//This method converts the lat,lon coordinates to the coordinates of the pixels in the image of the map (which is 1319 by 664)
public String GPStoCoord( double lat, double lon){
double latref = 30.631103;
double lonref = -96.358981;
double yref = 0.015128;
double xref = 0.035589;
int coordx = (int)((latref - lat)/yref*1319);
int coordy = (int)((lon - lonref)/xref*664);
return coordx + "," +coordy;
}
private void GPSlocdraw() {
try {
DatagramPacket packet_GPS1 = new DatagramPacket(new byte[PACKETSIZE], PACKETSIZE);
socket.receive(packet_GPS1);
String sGPS1 = new String(packet_GPS1.getData());
String latlonGPS1[] = sGPS1.split(",", 2);
double lat1 = Double.parseDouble(latlonGPS1[0]);
double lon1 = Double.parseDouble(latlonGPS1[1]);
//converting the GPS data to coordinates
String coord = GPStoCoord(lat1,lon1);
String latlon[] = coord.split(",");
int lat = Integer.parseInt(latlon[0]);
int lon = Integer.parseInt(latlon[1]);
drawPoint.setCoordx(lat);
drawPoint.setCoordy(lon);
drawPoint.repaint();
} catch( IOException e){}
}
public static void main( String args[] ) {
SwingUtilities.invokeLater(() -> new Server().GPSlocdraw());
}
}
这是 DRawPoint 类的代码,我试图在其中绘制加载的图像并在其顶部绘制椭圆形图形,似乎最后绘制的那个会擦除另一个。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class DrawPoint extends JPanel {
private int coordx, coordy;
@Override
public void paintComponent( Graphics g){
try {
BufferedImage map = ImageIO.read(new File("CSmap.png"));
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillOval(coordx,coordy,8,8);
g.drawImage(map,0,0,this);
} catch(IOException e){}
}
//use setters to change the state
void setCoordy( int coordy) {this.coordy = coordy;}
void setCoordx( int coordx) {this.coordx = coordx;}
}
另外,我怎样才能画一些东西在整个运行过程中永久留在图像上?
解决方案
以下代码演示了在底层图像的不同位置重复绘制一个点。
它可以复制粘贴到一个文件(Server.java)中并执行:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Server extends JFrame{
private DrawPoint drawPoint;
public Server() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
drawPoint = new DrawPoint();
add(drawPoint);
pack();
setVisible(true);
}
//This conversion is not essential for the question asked. remove to make it Mcve
//public String GPStoCoord( double lat, double lon){}
private void GPSlocdraw() {
//generate random x,y within an arbitrary range
Random rnd = new Random(); int maxY = 350, maxX = 250;
Timer timer = new Timer(1000, e -> { //periodically change coordinates and repaint
drawPoint.setCoordx(rnd.nextInt(maxX));
drawPoint.setCoordy(rnd.nextInt(maxY));
drawPoint.repaint();
});
timer.start();
}
public static void main( String args[] ) {
SwingUtilities.invokeLater(() -> new Server().GPSlocdraw());
}
}
class DrawPoint extends JPanel {
private int coordx, coordy, width, height;
private Image map;
public DrawPoint() {
try {
//to make an mcVe always use publicly available resources
map = ImageIO.read(new URL("http://www.digitalphotoartistry.com/rose1.jpg"));
height = map.getHeight(this);
width = map.getWidth(this);
setPreferredSize(new Dimension(width, height)); //fit panel to image
} catch ( IOException ex) {ex.printStackTrace(); }
}
@Override
public void paintComponent(Graphics g){
//read from file once, not every method run BufferedImage map = ImageIO.read(new File("CSmap.png"));
super.paintComponent(g);
g.setColor(Color.YELLOW);
g.drawImage(map,0,0,this);//image first
g.fillOval(coordx,coordy,8,8); //point on top
}
//use setters to change the state
void setCoordy( int coordy) {this.coordy = coordy;}
void setCoordx( int coordx) {this.coordx = coordx;}
}
至于“我怎样才能画一些东西在整个运行过程中永久留在图像上?” :得到一个想法不要改变椭圆的x和y坐标,看看会发生什么。
推荐阅读
- java - 使用 Java 流从字符串数字列表中查找最大数字
- excel - 使用 VBA 的 Sumifs
- c++ - Visual Studio 链接器正在使用旧/错误的文件路径来链接 .lib
- rest-assured - 如何在别名标头中传递电子邮件并获得特定响应?
- python - 使用 boto3 列出 AWS S3 文件夹
- javascript - 如何在 vuejs 中获取选择选项名称属性
- javascript - 无法在 JSX 中渲染对象。抛出错误对象作为 React 子对象无效(发现:[object Promise])
- python-3.x - 在 while 循环中尝试 & if 语句
- reactjs - 如何在 phantomjs 中创建反应应用程序
- python - 仅当包含特定值时才保留行