在Java中的已加载图像上绘制对象 [英] Draw objects on a loaded image in java

查看:60
本文介绍了在Java中的已加载图像上绘制对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要加载地图图像并在接收到的位置上绘制点的帮助. 这是服务器的代码:

I need help with loading an image of a map and drawing a point on the received location. Here is the code of the server:

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类的代码,在这里我试图绘制已加载的图像,并在其上绘制椭圆形图形,因为似乎最后绘制的哪个会擦除另一个图形.

Here is the code to the DRawPoint class, where I am trying to draw the image loaded and draw the oval graphic on top of it by it seems that whichever is drawn last erases the other.

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

此外,我如何在整个运行过程中绘制一些东西永久保留在图像上?

Also, how can I draw something to permanently stay on the image for the entire run?

推荐答案

以下代码演示了如何在基础图像的不同位置重复绘制一个点.
可以将其复制粘贴到一个文件(Server.java)中并执行:

The following code demonstrates repeatedly drawing a point in different location on an underlying image.
It can be copy pasted into one file (Server.java) and executed:

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坐标,然后看看会发生什么.

As for "how can I draw something to permanently stay on the image for the entire run?" : to get an idea do not change ovals x and y coordinates, and see what happens.

这篇关于在Java中的已加载图像上绘制对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆