# Screenshot höhere Qualität?



## Fabse (5. Sep 2012)

Hi,

ich mache mit der Robot Klasse einen Screenshot von meinem Bildschirm. Allerdings ist die Qualität doch deutlich schlechter als wenn ich auf die "Druck" Tase drücke.

Gibt es eine andere Funktion die die gleiche Qualität liefert wie die Druck taste?

Ich kann leider kleine Zahlen nicht erkennen auf dem Screenshot...

Dnake


----------



## Evil-Devil (5. Sep 2012)

Zunächst einmal erzeugt die Robot Klasse das Rectangle das du anfordest. Also ein 1:1 Abbild. Wenn du jetzt dein Bild zb. als JPG speicherst, dann ist das komprimiert und verlustbehaftet. Je nachdem wie hoch die Kompression eingestellt ist wird das Bild mehr oder weniger qualitativ hochwertig.


----------



## SlaterB (5. Sep 2012)

welchen Code hast du denn?
Robot liefert doch wohl zunächst ein Bild in den Speicher, vielleicht mit GUI anschauen,
wie man es dann speichert kann noch einen großen Unterschied machen

ich hab am mal eben schnell kopierten Code
> BufferedImage bi = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
> ImageIO.write(bi, "jpg", new File("screenshot.jpg"));

allerdings nicht viel auszusetzen..


----------



## Marco13 (5. Sep 2012)

Die Standard-Komprimierung von JPG bei ImageIO ist relativ hoch, je nach Bildinhalt kann das dann etwas unschön aussehen.

Speichere es ggf. mal als PNG, oder schau mal in http://www.java-forum.org/awt-swing-swt/141060-qualitaetsunterschiede-jpeg.html

EDIT: Der Beschreibung nach klingt das aber, als könnte man nicht ausschließen, dass das Bild kleinskaliert in dieser grottigen "Windows Bild- und ****sanzeige" angesehen wurde


----------



## Fabse (5. Sep 2012)

```
Robot alarm = null;
					try {
						alarm = new Robot();
					} catch (AWTException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
						System.out.println("Fehler Robot");
					}
					BufferedImage bild = new BufferedImage(1920,1080,1);
					Rectangle rec = new Rectangle(0,0,1920,1080);
					
					bild = alarm.createScreenCapture(rec);
					
					try {
						ImageIO.write(bild, "JPG", new File("C:\\Users\\Fabian\\Desktop\\Unbenannt-1.jpg"));
```

Das Bild ist dann gerade mal so 100kb groß.
Wenn ich mit druck nen Screen machen und den bei Photoshop auf maximal Qualität stelle bin ich bei 700kb. Aber so viel brauch ich gar nicht, ich brauchs nur ein bissl besser. 200kb sollten langen. Ich versuchs mal als png.

EDIT: bei png wird das Bild nur größer 1,7m aber die Quali ist gleich. Ich greife über die Dropbox auf den link zu und zoomen dann mit meinem iphone! Lege ich nen "manuellen" Screenshot in die Dropbox seh ich alles, aber wenn Java den dort einfügt seh ich nicht alles :noe:


----------



## SlaterB (6. Sep 2012)

hier ein Code, der bei mir beim Ausprobieren ein höherwertiges Jpg liefert,
sowohl in Dateigröße als auch Qualität, Gekräusel-Pixel um Buchstaben verschwinden,
auf grundsätzliche Lesbarkeit hat das aber kaum Auswirkung, die schwarzen Text-Pixel konnte man so oder so lesen..

Save a JPG with a specified quality

die ersten 14 Zeilen, die in ein BufferedImage malen musste ich aber entfernen, sonst gibts einen Rotstich fürs gesamte Bild,
vorest nicht kritisch, wenn man den Parameter als BufferedImage übergibt, funktioniert es direkt


-----

Suche: java save image high quality
bzw ähnliches


----------



## Fabse (6. Sep 2012)

Hey,

jetzt muss ich noch mal nachhaken... die ersten 14 Zeilen, die in das BufferedImage schreiben?
Die seh ich nicht ???:L


```
BufferedImage bi = new BufferedImage(
                icon.getIconWidth(), 
                icon.getIconHeight(),
                BufferedImage.TYPE_INT_ARGB
            );
            Graphics2D graphics2D = bi.createGraphics();
            graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics2D.drawImage(image, 0, 0, 
                icon.getIconWidth(), 
                icon.getIconHeight(),
                null
            );
```

Wenn ich das alles wegnehme gehts natürlich nicht weil bi fehlt!

Ansonsten sieht dein Screen schon gut aus, das könnte genau das sein was ich brauche, da ich mit dem iphone auf dem Bild zoome und kleine zahlen erkennen muss.

Wäre toll wenn du mir noch mal kurz helfen könntest


----------



## SlaterB (6. Sep 2012)

> vorest nicht kritisch, wenn man den Parameter als BufferedImage übergibt, funktioniert es direkt


habe ich danach noch geschrieben,
ändere den Bild-Parameter der Methode in 'BufferedImage bi'


----------



## Spacerat (6. Sep 2012)

Warum verwendest du der einfachheit halber nicht das PNG-Format? Das komprimiert verlustfrei.


----------



## Fabse (7. Sep 2012)

Spacerat hat gesagt.:


> Warum verwendest du der einfachheit halber nicht das PNG-Format? Das komprimiert verlustfrei.



Das Bild ändert sich komischerweise nicht :bahnhof: es wird nur über 1Mb groß, aber die Quali ist gleich "schlecht". Muss wohl daran liegen "wie" Java den Screen macht!? 

Das andere Programm bekomm ich immer noch nicht ans laufen ohne Rotstich  

Hab schon alles mögliche geändert was für mich Sinn macht alles in BufferedImage aber es bleibt einfach rot!


----------



## SlaterB (7. Sep 2012)

wie gesagt die 14 Zeilen entfernen,
Fehlermeldung BufferedImage bi fehlt
-> Methodenkopf in

> public void saveImage(BufferedImage bi, File file, int quality)
statt
> public void saveImage(Image image, File file, int quality)
ändern und gut ist

----

schau dir mein hochgeladenes Bild an, da sieht man in der Vergrößerung von Paint jeden Pixel einzeln,
besser geht nicht bei einer bestimmten Bildschirmauflösung, von Low zu High ändert sich auch nur etwas Gekräusel,
die schwarzen Pixel sind so oder so da, man kann erkennen dass beim 't' von 'Edit' unten rechts ein Pixel sitzt usw.

was genau ist für dich ein schlechtes oder gutes Bild, unlesbar oder lesbar?
wie sieht es hinsichtlich Pixeln aus?
sind noch irgendwelche Glättungseffekte oder so einzubeziehen?


> BufferedImage bi = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
> ImageIO.write(bi, "png", new File("screenshot.png"));

speichert bei mir auch in perfekt, kleiner als ein jpg,


----------



## Fabse (7. Sep 2012)

Super jetzt funktioniert es 

Ich weiß weit reinzoomen in das Bild weil ein paar Zahlen recht klein sind und dann etwas undeutlich waren, die wollte ich nen bissl deutlicher haben, aber jetzt gehts. Dank dir


----------

