BufferedImage kopieren



  • Hallo Forum,
    ich muss so eine Art Radarbild generieren, auf dem der Benutzer von oben sieht, wo er sich in der Szene gerade befindet. Ich habe ein BufferedImage mit dem Untergrund. Mit den Cursortasten kann man dann ein kleines Objekt darüberbewegen (momentan einfach nur ein mit drawString() gezeichneter Buchstabe). Dieser hinterlässt natürlich eine Spur, weil das Originalbild nicht wiederhergestellt werden kann.

    Also halte ich ein zweites BufferedImage, mit dem Originalbild. Bei jedem Cursortastendruck soll nun das zu zeichnende Bild mit dem Originalbild überschieben werden und danach der Buchstabe an die neue Stelle gezeichnet werden.

    Ich kann leider keine Methode finden, das Originalbild (biOriginalBufferedImage) auf das zu zeichnende Bild (biRenderedBufferedImage) zu kopieren. Momentan benutze ich einen Filter, der aber nichts bewirkt, um das Bild zu kopieren. Wie kann man es geschickter machen?

    [java]
    public void MoveUser(float myNewX, float myNewY){
    // Das zu zeichnende Bild mit dem Originalbild überschreiben
    AffineTransformOp tmpAffineTransformOp = new AffineTransformOp(new AffineTransform(), AffineTransformOp.TYPE_BILINEAR);
    biRenderedBufferedImage = tmpAffineTransformOp.filter(biOriginalBufferedImage, null);

    // Die Kamera wieder auf das "saubere" Bild zeichnen
    Graphics2D tmpRenderedGraphics2D = biRenderedBufferedImage.createGraphics();
    tmpRenderedGraphics2D.drawString("O", myNewX, myNewY);

    // Bild auf der GUI aktualisieren
    repaint();
    }[/code]



  • irgendwie macht du das tierisch kompliziert. ich habe sowas schon programmiert und bin dabei anders vorgegangen. ich hatte das problem mit zwei komponenten gelößt, beide von der gleichen klasse abstammend. in beiden kann man per schalter die zeichnung eines rechteckes auf dem bild an/aus schalten und in beiden kann man das bild skalieren. damit mußt du nur noch in der paint-methode das bild skaliert zeichnen lassen und ggf. das rechteck darauf. dadurch mußt du das bild nicht übermalen (wird von der paint-methode ohnehin gemacht) und du sparst eine menge code und rechenzeit. dannach kannst du ja beide als listener auf's keybord eintragen und entsprechend auf cursorbewegungen reagieren lassen, bzw. das von einem manager aus machen. ausserdem kannst du die komponenten in der das original gezeichnet wird in ein JScrollPane setzten und deine Navigationskarte als listener auf scrollbewegungen und als listener auf Komponentenvergrößerungen eintragen, was dann dazu führt, so daß dein Radarbild die bewegungen des Srollpanes und dessen größe entspricht. soviel mal zu meinem vorschlag für dein problem.

    Aber nun zur der Frage von dir: das kopieren von BufferedImages funkioniert folgendermaßen:

    /*Erstelle zunächst Kopie vom original mit gleicher größe und gleichem 
          Farbmodel */
        BufferedImage copyOfBufferedImage = new BufferedImage(biOriginal.getWidth(),
                                                             biOriginal.getHeight(),
                                                             biOriginal.getType());
        /*Grafikkontext der Kopie holen*/
        Graphics g = copyOfBufferedImage.getGraphics();
    
        /*in grafikkontext der Kopie das Original zeichnen*/
        g.drawImage(biOriginal,0,0,myObserver);
    

    ich hoffe, ich konnte dir helfen
    Wayne



  • Vielen Dank für den Code. Deinen Vorschlag lasse ich mir auch mal durch den Kopf gehen.


Anmelden zum Antworten