kostenloser Webspace werbefrei: lima-city


Graphics bleibt erhalten

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    nie-genug-gewuerzt

    nie-genug-gewuerzt hat kostenlosen Webspace.

    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();
        }
      }
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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.
  4. Autor dieses Themas

    nie-genug-gewuerzt

    nie-genug-gewuerzt hat kostenlosen Webspace.

    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?
  5. 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();
        }
      }
    }


  6. Autor dieses Themas

    nie-genug-gewuerzt

    nie-genug-gewuerzt hat kostenlosen Webspace.

    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!
  7. k**************s

    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...
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!