2D-Grafik Rechtecke auf Bilder legen und auslesen

3p1kur

Mitglied
Hallo

Ich habe eine Grafik im PNG Format, auf diese möchte ich Rechtecke beliebiger Höhe und Breite legen.
Aus dem Ganzen möchte ich dann die XY Koordinate aller Rechtecke auf der Grafik auslesen sowie deren Höhe und Breite. Die rechtecke sollen per drag and drop verschiebbar sein.
Gibt es eventuell schon Software, die die oben genannte Funktionalität implementiert und aus der ich leicht die Informationen auslesen kann?

Gruß
 

Marco13

Top Contributor
Die Klasse [c]com.sun.magic.DoWhatIWant[/c] gibt es leider noch nicht. Soll das ganze auf sowas rauslaufen wie zum Beispiel(!) eine XML-Datei
Code:
<stuff>
  <image>image.png</image>
  <rectangle>10 20 30 40</rectangle>
  <rectangle>50 60 70 80</rectangle>
   ....
</stuff>
und eine Art "Editor" dafür?
 

3p1kur

Mitglied
Hallo Marco

Die Rechtecke werden aus einer XML Datei ausgelesen, sollen aber über den Grafikeditor verschiebbar/vergrößerbar sein
und dann wieder in der XML gespeichert werden.
Ich wollte nur wissen ob es da schon was gibt ansonsten muss ich es halt selbst implementieren.

Gruß
 

André Uhres

Top Contributor
Ich habe eine Grafik im PNG Format, auf diese möchte ich Rechtecke beliebiger Höhe und Breite legen ... Die rechtecke sollen per drag and drop verschiebbar sein.

Hallo 3p1kur,

hier ist ein kleines Beispiel:

Java:
/*
 * ImageMarker.java
 *
 * Benutzt die Klassen JComponentBounds und ComponentsContainer:
 * http://wiki.byte-welt.net/wiki/JComponentBounds
 * http://wiki.byte-welt.net/wiki/ComponentsContainer
 *
 * Hier wird ein "mainpanel" mit OverlayLayout benutzt.
 * Darin sind ein "imagePanel" und ein überlagertes "markerPanel".
 * Die Methode "addMarker(markerPanel)" fügt einen neuen Marker hinzu.
 */

import container.JComponentBounds;
import container.ComponentsContainer;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.beans.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ImageMarker extends JFrame {

    private final static String FILENAME = "Picture1.jpg";
    private JPanel mainpanel;
    private Rectangle marker;
    private JButton btAddRect, btAddOval;
    private final ComponentsContainer markerPanel;
    private String filenameXml = "ImageMarker.xml";
    private final JPanel controls;

    public ImageMarker() {
        super("ImageMarker");
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        controls = new JPanel();
        mainpanel = new JPanel() {

            @Override
            public boolean isOptimizedDrawingEnabled() {
                return false;
            }
        };
        mainpanel.setLayout(new OverlayLayout(mainpanel));
        markerPanel = new ComponentsContainer();
        load(null);
        markerPanel.setOpaque(false);

        Picture imagePanel = new Picture(FILENAME);

        mainpanel.add(markerPanel);//zuerst den Marker Panel (vorne)
        mainpanel.add(imagePanel);//dann die Bildkomponente (hinten)

        add(new JScrollPane(mainpanel));
        btAddRect = new JButton("Add Rectangle");
        btAddRect.setPreferredSize(new Dimension(130, 25));
        btAddRect.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {
                addMarker(markerPanel, MarkerComponent.RECT);
            }
        });
        controls.add(btAddRect);
        btAddOval = new JButton("Add Oval");
        btAddOval.setPreferredSize(new Dimension(130, 25));
        btAddOval.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {
                addMarker(markerPanel, MarkerComponent.OVAL);
            }
        });
        controls.add(btAddOval);
        add(controls, BorderLayout.SOUTH);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(final WindowEvent e) {
                save(null);
                System.exit(0);
            }
        });
    }

    private void addMarker(final JPanel markerPanel, final int type) {
        marker = new Rectangle(0, 0, 100, 100);
        int m = JComponentBounds.MARGIN;
        final MarkerComponent markerComponent = new MarkerComponent(
                type, Color.RED, 1);
        markerComponent.setSize(marker.width + m * 2, marker.height
                + m * 2);
        markerComponent.setLocation(-m, -m);
        markerPanel.add(markerComponent);
        markerPanel.revalidate();
        displayMarkers();
    }

    private void displayMarkers() {
        System.out.println("Current Markers:");
        int componentCount = markerPanel.getComponentCount();
        for (int i = 0; i < componentCount; i++) {
            MarkerComponent component = (MarkerComponent) markerPanel.getComponent(i);
            int shape = component.getShape();
            String shapeS = null;
            if (shape == MarkerComponent.RECT) {
                shapeS = "RECT";
            } else if (shape == MarkerComponent.OVAL) {
                shapeS = "OVAL";
            }
            Rectangle componentRect = component.getComponentRect();
            System.out.println(shapeS + ": " + componentRect);
        }
    }

    private String save(final String filenameXml) {
        String returnValue = filenameXml;
        try {
            FileOutputStream fos = new FileOutputStream(
                    filenameXml == null ? this.filenameXml
                    : filenameXml);
            XMLEncoder o = new XMLEncoder(new BufferedOutputStream(fos));
            Component[] comps = markerPanel.getComponents();
            for (int i = 0; i < comps.length; i++) {
                o.writeObject(comps[i]);
            }
            o.close();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
            returnValue = null;
        }
        return returnValue;
    }

    private String load(final String filenameXml) {
        String returnValue = filenameXml;
        XMLDecoder d = null;
        Object component = null;
        try {
            returnValue = filenameXml == null ? this.filenameXml
                    : filenameXml;
            FileInputStream fis = new FileInputStream(returnValue);
            d = new XMLDecoder(new BufferedInputStream(fis));
            returnValue = new File(returnValue).getAbsolutePath();
            try {
                component = d.readObject();
                markerPanel.removeAll();
                while (component != null) {
                    markerPanel.add((Component) component);
                    component = d.readObject();
                }
            } catch (ArrayIndexOutOfBoundsException e) {
            }
            d.close();
        } catch (FileNotFoundException ex) {
        }
        return returnValue;
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                new ImageMarker().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}

class Picture extends JComponent {

    private BufferedImage image;
    private String filename;

    public Picture(String filename) {
        this.filename = filename;
    }

    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        if (image == null) {
            try {
                image =
                        ImageIO.read(getClass().getResource(filename));
                setPreferredSize(new Dimension(
                        image.getWidth(), image.getHeight()));
                revalidate();
            } catch (Exception ex) {
                image = new BufferedImage(
                        800, 600, BufferedImage.TYPE_INT_ARGB);
                Graphics graphics = image.getGraphics();
                graphics.setColor(Color.red);
                graphics.drawString("Bild nicht gefunden: "
                        + filename, 300, 500);
            }
        }
        Rectangle r = g.getClipBounds();
        g.drawImage(image, r.x, r.y, r.width + r.x, r.height + r.y,
                r.x, r.y, r.width + r.x, r.height + r.y, null);
    }

    public void setFilename(final String filename) {
        this.filename = filename;
        image = null;
        repaint();
    }
}

Java:
import container.JComponentBounds;
import java.awt.*;
import java.beans.*;
import java.util.logging.*;
import javax.swing.*;

/*
 * MarkerComponent.java
 */
public class MarkerComponent extends JComponentBounds {

    //PROPERTIES:
    private int shape;
    private Color color;
    private int strokeWidth;
    private BasicStroke stroke;
    //
    public static final int RECT = 0;
    public static final int OVAL = 1;
    private Color focus = new Color(0.1f, 0.1f, 0.1f, 0.4f);

    public MarkerComponent() {
        this(0, Color.GREEN, 5);
        transientProperties(new String[]{"focused",
                    "desktopIcon"});//desktopIcon is inherited
    }

    public MarkerComponent(final int shapeP, final Color colorP,
            final int strokeWidthP) {
        shape = shapeP;
        color = colorP;
        strokeWidth = strokeWidthP;
        stroke = new BasicStroke(strokeWidthP);
        setBounds(50, 50, 100, 100);
        setComponent(new ShapeLabel());
    }

    @Override
    public void setZorderAllowed(final boolean b) {
//        ((ComponentsContainer) getParent()).setZorderAllowed(b);
    }

    private void transientProperties(final String[] properties) {
        try {
            BeanInfo info =
                    Introspector.getBeanInfo(MarkerComponent.class);
            PropertyDescriptor[] propertyDescriptors =
                    info.getPropertyDescriptors();
            for (int i = 0; i < propertyDescriptors.length; ++i) {
                PropertyDescriptor pd = propertyDescriptors[i];
                for (int j = 0; j < properties.length; j++) {
                    if (pd.getName().equals(properties[j])) {
                        pd.setValue("transient", Boolean.TRUE);
                    }
                }
            }
        } catch (IntrospectionException ex) {
            Logger.getLogger(MarkerComponent.class.getName()).log(Level.SEVERE,
                    null, ex);
        }
    }

    public int getShape() {
        return shape;
    }

    public Color getColor() {
        return color;
    }

    public BasicStroke getStroke() {
        return stroke;
    }

    public void setStroke(final BasicStroke stroke) {
        this.stroke = stroke;
    }

    public void setShape(final int shape) {
        this.shape = shape;
    }

    public void setColor(final Color color) {
        this.color = color;
    }

    public int getStrokeWidth() {
        return strokeWidth;
    }

    public void setStrokeWidth(final int strokeWidth) {
        this.strokeWidth = strokeWidth;
        stroke = new BasicStroke(strokeWidth);
    }

    class ShapeLabel extends JLabel {

        public ShapeLabel() {
            super();
        }

        @Override
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(color);
            g2.setStroke(stroke);
            int w = (int) stroke.getLineWidth();
            int width = getParent().getWidth();
            int height = getParent().getHeight();
            Rectangle location = getComponentRect();
            switch (shape) {
                case RECT:
                    g2.drawRect(w / 2 + 1, w / 2 + 1, width - w
                            - 1, height - w - 1);
                    break;
                case OVAL:
                    g2.drawOval(w / 2 + 1, w / 2 + 1, width - w
                            - 1, height - w - 1);
                    break;
            }
            if (isFocused()) {
                g2.setColor(focus);
                g2.fillRect(0, 0, width, height);
                g2.setColor(Color.GRAY);
                g2.drawString(location.x + ", " + location.y + ", "
                        + (width) + "x" + (height), 5, 15);
            }
        }
    }
}

Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C 2D-Grafik Steganographie - Verschlüsselung von Dateien in Bildern - Bilder zeigen schwarze Rechtecke AWT, Swing, JavaFX & SWT 13
ronbot77 JavaFX Rechtecke werden nicht neu gezeichnet AWT, Swing, JavaFX & SWT 8
J Rechtecke mittels getWidth AWT, Swing, JavaFX & SWT 1
M Rechtecke drehen AWT, Swing, JavaFX & SWT 15
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
P Kreise Rechtecke AWT, Swing, JavaFX & SWT 5
A Kollisionsabfrage schiefer Rechtecke AWT, Swing, JavaFX & SWT 5
M Rechtecke auf Bild zeichnen AWT, Swing, JavaFX & SWT 9
D Rechtecke verschieben? AWT, Swing, JavaFX & SWT 2
N Autos (Rechtecke) in zufälligen Abständen von fahren lassen AWT, Swing, JavaFX & SWT 7
G Rechtecke beschriften AWT, Swing, JavaFX & SWT 3
F Zeichenbrett für Rechtecke mit Hindernissen AWT, Swing, JavaFX & SWT 17
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
F Bilder zu ausführbarer Jar-Datei hinzufügen AWT, Swing, JavaFX & SWT 5
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
G Bilder in javafx Project AWT, Swing, JavaFX & SWT 11
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Kirby.exe Bilder in GUI einfügen AWT, Swing, JavaFX & SWT 8
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
J Bilder aus dem SceneBuilder werden in der Jar nicht dargestellt AWT, Swing, JavaFX & SWT 4
TheWhiteShadow JavaFX Bilder werden ungewollt Skaliert AWT, Swing, JavaFX & SWT 1
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
J Bilder proportional verkleiner AWT, Swing, JavaFX & SWT 12
E Bilder skalieren AWT, Swing, JavaFX & SWT 4
DaCrazyJavaExpert Swing Bilder überlagern AWT, Swing, JavaFX & SWT 19
A Bilder als Hintergrund AWT, Swing, JavaFX & SWT 2
@SupressWarnings() JavaFX Bilder in executable jar laden AWT, Swing, JavaFX & SWT 5
Sugan JavaFX Bilder drucken AWT, Swing, JavaFX & SWT 0
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
Sugan Java FX Verzeichnisüberwachung -> Bilder auf GUI anzeigen AWT, Swing, JavaFX & SWT 4
E AWT Bilder als "Array" abspeichern. AWT, Swing, JavaFX & SWT 4
MrSnake Bilder aus Unterordner einfügen AWT, Swing, JavaFX & SWT 2
I 2D-Grafik Bilder Eingefügt, button jetzt im Hintergrund AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
thet1983 JTable Bilder AWT, Swing, JavaFX & SWT 6
GenerationLost Bilder an bestimmten Platz einfügen/Objekte visualisieren AWT, Swing, JavaFX & SWT 1
F Bilder in jFrame einfügen AWT, Swing, JavaFX & SWT 3
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
I Swing Bilder werden nach Export nicht angezeigt AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Bilder anzeigen AWT, Swing, JavaFX & SWT 4
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
vodkaz JFrame,Bilder und Zeitverzögerung AWT, Swing, JavaFX & SWT 2
A Swing Bilder werden nicht angezeigt AWT, Swing, JavaFX & SWT 3
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
Xbody 2D-Grafik JavaFX Bilder transformieren AWT, Swing, JavaFX & SWT 2
P Durch Bilder Scrollen AWT, Swing, JavaFX & SWT 2
F Bilder werden nicht in's Array geladen AWT, Swing, JavaFX & SWT 4
K Bilder übereinanderlegen AWT, Swing, JavaFX & SWT 11
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
Karuka 2D-Grafik Bilder in GridLayout einfügen AWT, Swing, JavaFX & SWT 7
J Bilder in ausführbare jar einbinden AWT, Swing, JavaFX & SWT 7
J Swing Bilder anzeigen in Gridlayout AWT, Swing, JavaFX & SWT 11
H 2D-Grafik Bilder laden ist nicht zuverlässig AWT, Swing, JavaFX & SWT 3
F Bilder ineinander kopieren AWT, Swing, JavaFX & SWT 3
P Bilder verkleinern AWT, Swing, JavaFX & SWT 2
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
Furtano AWT Skalierung mehrerer Bilder / Histogramme im Fenster AWT, Swing, JavaFX & SWT 4
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
T 2D-Grafik Statisches Hintergrundbild, dynamische Bilder drüber AWT, Swing, JavaFX & SWT 2
C Zwei Bilder übereinander legen AWT, Swing, JavaFX & SWT 1
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
S Flickr Bilder in Gui Oberfläche AWT, Swing, JavaFX & SWT 21
L Bilder im JPanel als Hintergrund - Swing AWT, Swing, JavaFX & SWT 2
K Bilder nacheinander einfügen AWT, Swing, JavaFX & SWT 3
H Bilder auf Buttons per Klick tauschen ( Puzzle ) AWT, Swing, JavaFX & SWT 8
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
P 2D-Grafik Viele Bilder zu einem Video AWT, Swing, JavaFX & SWT 3
J Vergleicher zweier Bilder AWT, Swing, JavaFX & SWT 2
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
L Swing Bilder über andere Bilder laden AWT, Swing, JavaFX & SWT 3
J Bilder überlappen AWT, Swing, JavaFX & SWT 18
P Bilder werden nach Änderung nicht angezeigt AWT, Swing, JavaFX & SWT 15
M Mehrere Bilder auf einmal anzeigen AWT, Swing, JavaFX & SWT 9
P Swing html mit bilder drin AWT, Swing, JavaFX & SWT 12
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
E Bilder auf JFrame AWT, Swing, JavaFX & SWT 7
R Bilder über URL einfügen AWT, Swing, JavaFX & SWT 4
F Applet zeigt Bilder nicht an AWT, Swing, JavaFX & SWT 5
M FileChooser Bilder auswählen AWT, Swing, JavaFX & SWT 8
G Swing Bilder zeichnen AWT, Swing, JavaFX & SWT 28
L Swing Bilder im Icons-Ordner AWT, Swing, JavaFX & SWT 4
U Bilder in Jar werden nicht gefunden AWT, Swing, JavaFX & SWT 5
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
A Bilder vergleichen AWT, Swing, JavaFX & SWT 4
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
E AWT Bilder und Java AWT, Swing, JavaFX & SWT 11
P Bilder einfügen AWT, Swing, JavaFX & SWT 4
D Swing JEditorPane mit HTML aber ohne Bilder AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben