Screencapture mit perfekter qualität erstellen

Status
Nicht offen für weitere Antworten.

TheJavaKid

Top Contributor
mit der robot klasse kann man ja screencapture machen

ich habs schon probiert
wenn ichs im programm ausgebe schaut das doch recht ordentlich aus

aberw wenn ichs als datei ausgebe schaut es dementsprechend schlecht aus (ich gebs mit jpg als endung aus)

habs probiert mit:

BufferedImage bi = new Robot().createScreenCapture(
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );

OutputStream out = new FileOutputStream( "c:/screenshot.jpg" );
JPEGCodec.createJPEGEncoder( out ).encode( bi );
out.close();

und so:

BufferedImage bi = new Robot().createScreenCapture(
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );

ImageIO.write( bi, "jpg", new File("c:/screenshot2.jpg") );


wie kann ich das ausgeben dass die qualität stimmt?
 

TheJavaKid

Top Contributor
so habs jetzt mal probiert mit:

ImageIO.write( bi, "png", new File("c:/screenshot2.png") );

das schaut schon besser aus
aber auch noch nicht perfekt...
 

AlArenal

Top Contributor
Dass JPEG eine verlustbehaftetet Komrpimierung verwendet, sollte bekannt sein. Wenn man KEINE Verluste haben will, muss man sich entsprechend ein anderes Format suchen.
 

byte

Top Contributor
Das Problem ist hier aber nicht das JPEG Format, sondern wohl eher die Robot#createScreenCapture(). ImageIO#write() schreibt die Bilddatei je nach Qualität des BufferedImages. Offensichtlich wird das aber schon mit einer sehr schlechten Qualität erzeugt. Auch als BMP ist die Qualy schlecht.

Ich würd mich mal umschauen, obs da ne externe Lib gibt, die das besser kann. Ansonsten gibts ja vielleicht auch ein Pendant zu createScreenCapture() in der WinAPI. Dann könnte man sich das kurz mit JNI einbinden.
 

Narmer

Mitglied
Hallo,
ich habe ein ähnliches Problem. Eine mit ImageIO 'exportierte' JComponent, in diesem Falle ein Hexagon, verliert deutlich an Qualität. Als Format habe ich PNG verwendet. In Java sieht es perfekt aus...im exportierten Bild passen die Ecken nicht mehr richtig. Dabei hat sich an den Daten nichts verändert, d.h. das exakt gleiche Shape wird in ein BufferedImage 'gezeichnet' und skaliert wird auch nichts. Trotzdem der Qualitätsverlust. Würde mich auch interessieren ob das Verlustfrei ginge.
Gruß,
Narmer
 

foobar

Top Contributor
Ansonsten gibts ja vielleicht auch ein Pendant zu createScreenCapture() in der WinAPI. Dann könnte man sich das kurz mit JNI
Unter Windows kann man mit der Druck-Taste einen Screenshot machen, vielleicht lässt sich das irgendwie nutzen.
 

justchris

Mitglied
Hmm, am JPEG oder PNG Format kann das nicht liegen. Jeder der schoneinmal mit einem Bildbearbeitungsprogramm gearbeitet hat weiss, dass auch in diesen Formaten eine vom Orginal nicht zu Unterscheidene Bildqualität, bei entsprechender Qualitätseinstellung, erzeugt werden kann.

Der Fehler kann also nur mit den Kompressionseinstellungen der Formate oder mit der createScreenCapture Methode zu tun haben. Bin leider noch Java-Anfänger und kann Dir da nicht mehr weiterhelfen. Vielleicht meldet sich hier ja mal jemand der das auch beruflich macht.

Gruß Chris
 

Narmer

Mitglied
Hi,
ich denke ich habe einen Ansatzpunkt woran es beim 'fehlerhaften' Export nach z.B. PNG harpern könnte.
Wenn ich mit 'setClip(Shape)' aus Graphics versuche den Zeichenbereich exakt einzugrenzen entsteht derselbe
Fehler. Das Clipping scheint gerade bei Polyonen nicht Pixel-genau zu sein.
Ein kleines Beispiel:
Code:
graphicsObjekt.draw(irgendEinPolygon);
oder
Code:
graphicsObjekt.setClip(irgendEinPolygon);
graphicsObjekt.draw(irgendEinPolygon);
Die 2 Operationen sollten eigentlich dasselbe Ergebnis bringen.
Im zweiten Fall wird halt vor dem Zeichnen der Zeichenbereich auf exakt das gleiche Polygon eingeschränkt, was aber auf das Ergebnis theoretisch keinen Einfluß haben dürfte. Tatsächlich aber ergeben sich an einigen Kanten Fehler, also Pixel die nicht gezeichnet wurden.
Ich habe keine Ahnung ob irgendwann, während des Prozesses vom BufferedImage bis hin zum PNG-Bild, Clipping-Operationen verwendet werden. Die Ähnlichkeit zwischen dem exportierten PNG und dem mit Clipping-Operation in Java gezeichneten Polygon ist allerdings verdammt groß.
Eine Lösung dazu hab ich allerdings noch nicht ???:L . Bei meinem Problem müsste alles bis auf den Pixel genau stimmen :autsch:.
Gruß,
Narmer
 

bronks

Top Contributor
Hackl hat gesagt.:
...
ImageIO.write( bi, "png", new File("c:/screenshot2.png") );

das schaut schon besser aus
aber auch noch nicht perfekt...
Egal welchen der geposteten Code ich verwende: Das PNG sieht immer perfekt aus.
 

Brainiac

Bekanntes Mitglied
Eventuell macht ja der Grafiktreiber da murks. Es gab hier auch schon leute die mussten den Trieber zurücksetzen, da bei ihnen die Frames nicht korrekt oder gar nicht angezeigt wurden. Einfach mal probieren.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben