# Screenshot in Java



## Panzer_57 (6. Jul 2007)

Hallo,

ich möchte gerne einen Screenshot automatisch machen. Gibt es in Java eine Klasse mit der ich das kann?

Wenn nicht, kann ich vl auf ein Screenshot-Programm zugreifen und damit einen Screenshot machen?

Jetzt schon vielen Dank für die Hilfe,


mfg Panzer


----------



## The_S (6. Jul 2007)

java.awt.Robot


----------



## PollerJava (6. Jul 2007)

```
BufferedImage screenShotscreenShot = new Robot().createScreenCapture(new Rectangle((int)myPanel.getLocationOnScreen().getX(), (int)myPanel.getLocationOnScreen().getY(), myPanel.getWidth(), myPanel.getHeight()));  
ImageIO.write(screenShot, "png", new File(pfadAusgabe));
```


----------



## Guest (6. Jul 2007)

www.java-forum.org/de/viewtopic.php?t=50962&highlight=robot+screenshot

Suchen...geht auch.


----------



## Panzer_57 (6. Jul 2007)

> *Code:*
> 
> ```
> BufferedImage screenShotscreenShot = new Robot().createScreenCapture(new Rectangle((int)myPanel.getLocationOnScreen().getX(), (int)myPanel.getLocationOnScreen().getY(), myPanel.getWidth(), myPanel.getHeight()));
> ...



Macht dein Code einen Screenshot vom ganzen Bildschirm oder vom aktiven Fenster? Ich brauche nur das Fenster.

Wie kann ich das als Applet schreiben? Ich habs versucht, aber da ich noch nie ein Applet geschrieben habe, hatte ich ein paar probleme...


----------



## The_S (6. Jul 2007)

Dieser Code ist nur das aktuelle Panel.

Was für Probleme hast du denn dabei in deinem Applet? Fehlermeldung?


----------



## PollerJava (6. Jul 2007)

createScreenCapture(x,y,width, heigth);


----------



## Panzer_57 (6. Jul 2007)

Ja, Fehlermeldung.

Und zwar: Cannot find Symbol - Class BufferedImage

Ich hab aber alle Klassen aus dem Paket importiert.


----------



## The_S (6. Jul 2007)

dann fehlt das package java.awt.image.*/BufferedImage;


----------



## Marco13 (6. Jul 2007)

In einem Applet wirst du erstmal keinen Robot verwenden können. (Und das ist auch gut so!!!). Du könntest evtl. die Permissions so setzen, dass du das darfst, aber ich bin nichtmal sicher, ob das _überhaupt_ möglich ist. (Robot ist zu mächtig, als dass man ihn in einem Applet _überhaupt_ verwenden können sollte. Evtl. kannst du mit sowas wie
meinApplet.paint(einBufferedImage.getGraphics());
das Applet in ein BufferedImage reinmalen lassen. (Um das abzuspeichern, brauchst du zwar auch Permissions, aber das geht auf jeden fall irgendwie)


----------



## Panzer_57 (6. Jul 2007)

Ich versuchs jetzt mal in einer normalen Klasse.

Hier kommt aber die Fehlermeldung: cannot find Symbol - class myPanel


----------



## The_S (6. Jul 2007)

@Marco

Voraussetzung ist natürlich, dass das Applet signiert ist

@Panzer

Ach komm, denk halt bitte ein bisschen mit!


----------



## Panzer_57 (6. Jul 2007)

Sry hab ich nicht dazugeschrieben.

Klar muss ichs importieren, meine Frage war welches Paket das ist - habs selbst nicht gefunden.

gesucht habe ich auf: http://java.sun.com/j2se/1.5.0/docs/api/index.html


----------



## The_S (6. Jul 2007)

Nochmal der Aufruf ein bisschen mitzudenken. myPanel ist garantiert keine Klasse. Klassen schreibt man groß!


----------



## Panzer_57 (6. Jul 2007)

Ok das hätte mir wirklich auffallen sollen... Sry

Er schreibt natürlich cannot find Symbol - variable myPanel
und my Panel ist das Fenster das ich als Image haben will, richtig?


----------



## The_S (6. Jul 2007)

ja


----------



## Panzer_57 (6. Jul 2007)

Was bedeutet das ImageIO?
Meine IDE interpretiert es als Variable, aber es wird groß geschrieben.


----------



## The_S (6. Jul 2007)

ImageIO ist eine Klasse mit der man Bilder schreiben und laden kann.


----------



## Panzer_57 (6. Jul 2007)

Ok nachdem ich alle Klassen importiert habe, usw. kommt eine neue, mir unbekannte Fehlermeldung.

unreported exception java.awtAWTException; must be caught or declared to be thrown

Was heißt das???


----------



## The_S (6. Jul 2007)

Das du entweder deiner Methode die Möglichkeit gibst eine AWTException zu werfen, oder den entsprechenden Code in einen Try-Catch Block einbettest, der eine AWTException fängt.


----------



## Panzer_57 (6. Jul 2007)

Gut danke.
Aber eins müsst ich dazu noch wissen. Was ist eine AWTException?


----------



## The_S (6. Jul 2007)

http://java.sun.com/j2se/1.5.0/docs/api/java/awt/AWTException.html


----------



## Panzer_57 (6. Jul 2007)

Danke, aber kannst du mir das auf deutsch auch erklären?

Ich versteh ned alles was da steht.


----------



## The_S (6. Jul 2007)

Naja, eine AWTException wird geworfen wenn das AWT einen Fehler verursacht hat bzw. im AWT ein Fehler aufgetreten ist.


----------



## Panzer_57 (6. Jul 2007)

ok also schreibe ich:

```
try{...}
catch(ATWException){}
```

und was kommt da zwischen die klammern?


----------



## Marco13 (6. Jul 2007)

Komisch, dass in diesem Thread noch niemand auf "Java ist auch eine Insel" oder andere _Grundlagen_bücher verwiesen hat...


----------



## The_S (6. Jul 2007)

der code, der den fehler verursachen könnte!?

[edit] @Marco heute is Freitag, da will ich mal nicht so sein


----------



## Panzer_57 (6. Jul 2007)

Sry mein Fehler.

Wenn ich das so schreibe: catch(AWTException)
bekomme ich die Fehlermeldung identifier excepted. Was für einen Identifier brauch ich?

Kostet Java ist auch eine Insel was?


----------



## The_S (6. Jul 2007)

naja, du stellst einfach so eine Klasse in den Raum. Dem catch-Block wird aber ein Objekt übergeben, folglich brauchst du eine Klasse mitsamt Variablennamen.

Das Buch gibts gratis auf www.galileocomputing.de


----------



## Panzer_57 (6. Jul 2007)

wie schreibt man das? wir haben das in der schule nur kurz durchgenommen.


----------



## Marco13 (6. Jul 2007)

Wir haben das in der Schule *garnicht* durchgenommen, und ich weiß es trotzdem (das war jetzt schon kein Wink mit dem Zaunpfahl mehr, sondern mit einem ganzen Zaun...)

```
try
{
    machWasBöses();
} 
catch (AWTException dasIstDasExceptionObjektDasVielleichtVonObenAngeflogenKommt)
{
    dasIstDasExceptionObjektDasVielleichtVonObenAngeflogenKommt.printStackTrace();
}
```


----------



## Panzer_57 (6. Jul 2007)

danke

ich mach das noch nicht solange erst seit einem jahr, was wir eben in der schule gelernt haben und bin erst seit kurzem soweit, das sowas wirklich relevant ist.


----------



## Panzer_57 (6. Jul 2007)

screenShot is already defined heißt die nächste fehlermeldung.

ich weiß das ich vl ein bisschen nerve, aber es ist das erste mal dass ich sowas anspruchsvolles programmiere und ich kenne die fehlermeldungen noch nicht


----------



## The_S (6. Jul 2007)

Dann hast du zwei Variablen "screenShot" genannt.


----------



## Panzer_57 (16. Jul 2007)

Ich habs jetzt so weit, dass ich keine Fehlermeldung bekomme. Aber Screenshot macht er immer noch keinen.

Das ist mein Code:

```
public class Screen{
    public void printScreen(){
        Panel myPanel=new Panel();
        int i=1;
        BufferedImage screenShot=new BufferedImage(350, 288, 2);
        boolean test=false, test2=false;
        while(test){
            try{
                screenShot = new Robot().createScreenCapture(new Rectangle((int)myPanel.getX(), (int)myPanel.getY(), myPanel.getWidth(), myPanel.getHeight()));  
            }catch(AWTException e){
                e.printStackTrace();
                test=true;
            }
        }
        while(test2){
            try{
                ImageIO.write(screenShot, "jpg", new File("./Screenshots/Screenshot " + i));
            }catch(IOException f){
                f.printStackTrace();
                test2=true;
            }
        }
    }
}
```


----------



## The_S (16. Jul 2007)

Äh, die Schleifen sind recht sinnfrei. Und da beide boolean von Anfang an auf false stehen, werden die Schleifen natürlich auch nie durchgelaufen!

Und warum verwendest du irgendwelche wild gewählten Zahlen bei der Typendefinition des BufferedImages? Da verwendet man z. B. BufferedImage.TYPE_INT_RGB, aber nicht "2" :roll: .


----------



## Panzer_57 (16. Jul 2007)

Mit den Schleifen hattest du recht, danke. Ich weiß auch nicht mehr wozu ich die da reingeschrieben hab...

Ich habs einfach mal mit irgendeiner Zahl ausprobiert, weil wenn ich da reinschreib:

```
BufferedImage screenShot=new BufferedImage(350, 288, TYPE_INT_RGB);
```
fehlt die Variable TYPE_INT_RGB...


#edit:
Bitte nicht antworten, bin gleich nachdem ichs geschrieben hab selbst draufgekommen  
blöd...


----------



## The_S (16. Jul 2007)

Irgendeine Zahl reinschreiben ist sicher nie sinnvoll. Schau dir doch einfach mal die entsrpechende Klasse in dem API an! Und wenn du meinen hinweis nochmal liest, was du reinschreiben sollst, dann findest du deinen Fehler sicherlich auch schnell  ! Mal ganz davon abgesehen, dass du eigentlich überhaupt keine neue Instanz deines BufferedImages erstellen musst ...


----------



## Panzer_57 (16. Jul 2007)

Ich habe bis jetzt den Code verwendet den jemand früher in diesem Thread gepostet hat. Jetzt habe ich mich allerdings entschieden es selbst zu schreiben und mit Hilfe der API bin ich bis jetzt soweit gekommen:

```
public class Screenshot{
    public void printScreen(){
        Rectangle rect=new Rectangle(int 500, int 200, int 350, int 288);
        Robot rob=new Robot();
        rob.createScreenCapture(rect);
    }
}
```

Ich bekomme die Fehlermeldung in der 3. Zeile: '.class' expected.
Was heißt das, was kann ich dagegen tun?

Außerdem wüsste ich gerne: Kann das so überhaupt funktionieren?


----------



## The_S (16. Jul 2007)

äh, du solltest dich nochmal mit den Grundlagen der Java-Syntax beschaffen!


```
Rectangle rect=new Rectangle(int 500, int 200, int 350, int 288);
```

ist völliger Schwachsinn. Warum "int"?


----------



## Panzer_57 (16. Jul 2007)

warum nicht int?

Auszug aus der API Constructor Summary:

Rectangle(*int* x, *int* y, *int* width, *int* height) 
          Constructs a new Rectangle whose top-left corner is specified as (x, y) and whose width and height are
          specified by the arguments of the same name.

Was mache ich deiner Meinung nach falsch?


#edit:
OMG ich pack mich heute nicht!!!!
Hab wohl zu wenig geschlafen, sry...
Bin heut ned gut drauf, schon das zweite mal so ein dummer Fehler


----------



## The_S (16. Jul 2007)

Meld dich einfach, wenn du noch n paar kuriose Fehler zu vermelden hast


----------



## Panzer_57 (16. Jul 2007)

Gibt es eine Methode mit der ich das Image jetzt speichern kann?


----------



## The_S (16. Jul 2007)

Nach wie vor ImageIO.write


----------



## thE_29 (16. Jul 2007)

http://www.java-forum.org/de/viewtopic.php?p=313519#313519


----------



## Panzer_57 (16. Jul 2007)

Mein Debugger zeigt jetzt keine Fehlermeldungen, aber Speichern tut das Programm das Bild immer noch nicht...


```
try{
                ImageIO.write(img, "jpg", new File("././Screenshots"));
            }catch(IOException ioE){
```


----------



## The_S (16. Jul 2007)

dein debugger zeigt keine Fehlermeldung? Wird denn ansonsten eine Exception geworfen? Speicher das testhalber einfach mal ins ausführungsverzeichnis ohne ././ ...


----------



## Panzer_57 (16. Jul 2007)

Gut das hat funktioniert.  
Aber er speichert es nur als Datei und nicht als jpg. Weiß jemand woran das liegen könnte?


----------



## The_S (16. Jul 2007)

Er speichert es schon als JPG, du hast einfach vergessen die Endung (.jpg) mitzugeben, deshalb wird es von deinem Betriebssystem nicht als jpeg erkannt, ein jpeg ist es aber dennoch.

Die Dateiendung hat streng gesehen nichts mit dem Inhalt der Datei zu tun!


----------



## Panzer_57 (16. Jul 2007)

Sehr gut! Es geht.

vielen vielen Dank

mfg Panzer


----------



## Xams (16. Jul 2007)

Vier Seiten Erklärungen, obwohl du schon im dritten Post ein Link zu Java ist auch eine Insel bekommen hast.
Da findest du ein schönes Demo-Programm, das einen Screenshot erstellt und als JPEG speichert.
MFG


----------



## Panzer_57 (16. Jul 2007)

Schon komisch das ich nicht so ein umfangreiches Buch wie Java ist auch eine Insel durchsucht hab. Hätte ja nur ein paar Tage gedauert...

Wenn du gepostet hättest, dass es im Buch gut erklärt geschrieben steht, vl sogar schon auf der erstens Seite, hätte ich die anderen nicht nerven müssen, da hast du recht.


----------



## The_S (16. Jul 2007)

Also da muss ich Java-Freak mal in Schutz nehmen! Wenn du nicht zuviel Geld hast, wirst du nie jemanden finden, der sich mit dir hinhockt und dir Java von A-Z beibringt! Ich denke mal 90% aller Programmierer haben ihre Sprache gelernt bzw. vertieft indem sie ein Buch gelesen haben. Anders geht es nunmal (fast) nicht. Java-Freak hat es nur gut gemeint, indem er dir ein Buch vorgestellt hat, das kostenlos ist und mit dessen Hilfe du lernen und Kentnisse vertiefen kannst.

Achja, so ein Buch hat auch ein Inhaltsverzeichnis  .


----------



## Panzer_57 (16. Jul 2007)

Ich lerne ja aus dem Buch, ich lese es aber nicht ganz, weil ich kein totaler Anfänger bin.

Im Inhaltsverzeichnis hab ich nichts gefunden (vl überlesen), ich hab auch nur gemeint wenn es ihn stört das ihr mir hier geholfen habt, hätte er auch sagen können das es in dem Buch steht, dann hätte ich genauer gesucht oder gefragt wo es steht.


----------

