Graphics bleibt erhalten
lima-city → Forum → Programmiersprachen → Java
all
bemalen
bild
code
dokument
eigene bilder
einstellung
entsprechende bild
ersten bilder
file
hintergrund
hintergrundbild
image
import
malen
null
referenz
string
swing
system
-
Hallo,
ich versuche mit Java Bilder zu malen. Das funktioniert soweit auch ganz gut, nur dass die Sachen, die ich auf eines der ersten Bilder gemalt hate auch in den nächsten erscheinen. Eigendlich will ich das BufferedImage hintergrund haben und bei jedem Schleifendurchlauf neu auf dieses Bild malen können. Dafür dient eigendlich die Variable bild, doch es funktioniert dennoch nicht.
Weiß einer, wie ich das Bild immer neu bemalen kann?
Hier der Code:import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; public class bilderMalen { public static void neu(Graphics g, int x,int y, int breite, int hoehe, int tiefe){ g.fillOval(x, y, breite, hoehe); g.fillOval(x-tiefe, y+540, breite, hoehe); } public static void main(String[] args) { try { //Hintergrundbild generieren Image img = new ImageIcon(ImageIO.read(new File("C:/Dokumente und Einstellungen/All Users/Dokumente/Eigene Bilder/dreid/bg_orginal.jpg"))).getImage(); BufferedImage hintergrund = new BufferedImage(1920, 1080, BufferedImage.TYPE_INT_RGB); // Erstelle Bild mit richtigen Maßen hintergrund.getGraphics().drawImage(img, 0,0, 1920, 540, null); //male bild hintergrund.getGraphics().drawImage(img, 0,540, 1920, 540, null); //male bild ImageIO.write(hintergrund, "jpeg", new File("C:/Dokumente und Einstellungen/All Users/Dokumente/Eigene Bilder/dreid/bg.jpg")); System.out.println("Hintergrund generiert"); for (int i=0;i<10 ;i++ ) { BufferedImage bild=hintergrund; Graphics g = bild.getGraphics(); g.setColor(Color.GREEN); neu(g, 10+i*7, 10+i*3, (int)(i*0.5)+5, i+5, (int)(i*0.5)); neu(g, 1910-i*7, 10+i*3, (int)(i*0.5)+5, i+5, (int)(i*0.5)); ImageIO.write(bild, "jpeg", new File("C:/Dokumente und Einstellungen/All Users/Dokumente/Eigene Bilder/dreid/bild_"+i+".jpg")); System.out.println("Bild "+i+" erstellt."); } } catch (IOException e) { e.printStackTrace(); } } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
So wie du das vor hast kann das nicht funktionieren... du musst das Bild bei jedem Schleifendurchlauf neu anlegen oder du übermalst dein Bild jedesmal per
...fillRect
Wie du das machen willst musst aber du wissen. -
Ich hatte mir überlegt, dass das Bild in der Variable hintergrund gespeichert bleibt und beim Schleifendurchlauf wird dann das neue Bild bild angelegt, in dass der Hintergrund geschrieben wird.
Eigendlich verändere ich ja nirgendwo hintergrund, sondern nur das entsprechende Bild im Schleifendurchlauf.
Heißt das ich muss das Bild bei jedem Durchlauf neu aus der Datei laden? -
Hallo nie-genug-gewürzt,
am Anfang Deiner Schleife kopierst Du nur die Referenz von hintergrund nach bild (BufferedImage bild=hintergrund;), d.h. bild ist das selbe Objekt wie hintergrund und kein neues Bild. Du musst ein zweites Bild erzeugen, dort den Hintergrund reinmalen und dann den Rest. Dann funktioniert das.
import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; public class bilderMalen { public static void neu(Graphics g, int x,int y, int breite, int hoehe, int tiefe){ g.fillOval(x, y, breite, hoehe); g.fillOval(x-tiefe, y+540, breite, hoehe); } public static void main(String[] args) { try { //Hintergrundbild generieren Image img = new ImageIcon(ImageIO.read(new File("C:/Dokumente und Einstellungen/All Users/Dokumente/Eigene Bilder/dreid/bg_orginal.jpg"))).getImage(); BufferedImage hintergrund = new BufferedImage(1920, 1080, BufferedImage.TYPE_INT_RGB); // Erstelle Bild mit richtigen Maßen hintergrund.getGraphics().drawImage(img, 0,0, 1920, 540, null); //male bild hintergrund.getGraphics().drawImage(img, 0,540, 1920, 540, null); //male bild ImageIO.write(hintergrund, "jpeg", new File("C:/Dokumente und Einstellungen/All Users/Dokumente/Eigene Bilder/dreid/bg.jpg")); System.out.println("Hintergrund generiert"); BufferedImage bild = new BufferedImage(1920, 1080, BufferedImage.TYPE_INT_RGB); for (int i=0;i<10 ;i++ ) { Graphics g = bild.getGraphics(); g.drawImage(hintergrund, 0, 0, 1920, 1080, null); g.setColor(Color.GREEN); neu(g, 10+i*7, 10+i*3, (int)(i*0.5)+5, i+5, (int)(i*0.5)); neu(g, 1910-i*7, 10+i*3, (int)(i*0.5)+5, i+5, (int)(i*0.5)); ImageIO.write(bild, "jpeg", new File("C:/Dokumente und Einstellungen/All Users/Dokumente/Eigene Bilder/dreid/bild_"+i+".jpg")); System.out.println("Bild "+i+" erstellt."); } } catch (IOException e) { e.printStackTrace(); } } }
-
Vielen Dank!
Ich dachte ich kopiere mir damit das Bild und nicht nur die Referenz, aber hier ist das wohl wie bei normalen Objektreferenzen...
So funktioniert es nun, danke! -
BTW: Klassen schreibt man mit CamelCase und Variablen mit camelCase...
Wenn das ganze auf einem JPanel gemalt wird, kannst du auch einfach die paintComponent überschreiben... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage