Ta skjermbilder ved hjelp av Java

1. Introduksjon

I denne opplæringen vil vi se på noen forskjellige måter å ta et skjermbilde på Java.

2. Ta et skjermbilde ved hjelp av Robot

I vårt første eksempel skal vi ta et skjermbilde av hovedskjermen.

For det bruker vi createScreenCapture () metoden fra Robot klasse. Det tar en Rektangel som en parameter som setter grensene for skjermbildet og returnerer a BufferedImage gjenstand. De BufferedImage kan videre brukes til å lage en bildefil:

@Test offentlig ugyldighet givenMainScreen_whenTakeScreenshot_thenSaveToFile () kaster Unntak {Rectangle screenRect = new Rectangle (Toolkit.getDefaultToolkit (). GetScreenSize ()); BufferedImage capture = new Robot (). CreateScreenCapture (screenRect); Fil imageFile = ny fil ("single-screen.bmp"); ImageIO.write (capture, "bmp", imageFile); assertTrue (imageFile .exists ()); }

Dimensjonene på skjermen er tilgjengelige gjennom Verktøysett klasse ved å bruke sin getScreenSize () metode. På systemer med flere skjermer brukes primærskjermen som standard.

Etter å ha tatt skjermen inn Bufret bilde, vi kan skrive det til filen med ImageIO.write (). For å gjøre dette trenger vi to ekstra parametere. Bildeformatet og selve bildefilen. I vårt eksempel, vi bruker.bmp format, men andre liker.png, .jpg eller .gif er også tilgjengelig.

3. Ta et skjermbilde av flere skjermer

Det er også mulig å ta et skjermbilde av flere skjermer samtidig. Akkurat som med forrige eksempel, kan vi bruke createScreenCapture () metoden fra Robot klasse. Men denne gangen må grensene til skjermbildet dekke alle nødvendige skjermer.

For å få alle skjermene, bruker vi GrafikkMiljø klasse og dens getScreenDevices () metode.

Deretter skal vi hente grensen til hvert enkelt skjermbilde og lage en Rektangel som passer alle sammen:

@Test offentlig ugyldighet givenMultipleScreens_whenTakeScreenshot_thenSaveToFile () kaster unntak {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); GraphicsDevice [] screens = ge.getScreenDevices (); Rektangel allScreenBounds = nytt rektangel (); for (GraphicsDevice screen: screens) {Rectangle screenBounds = screen.getDefaultConfiguration (). getBounds (); allScreenBounds.width + = screenBounds.width; allScreenBounds.height = Math.max (allScreenBounds.height, screenBounds.height); } BufferedImage capture = new Robot (). CreateScreenCapture (allScreenBounds); Fil imageFile = ny fil ("all-screens.bmp"); ImageIO.write (fange, "bmp", imageFile); assertTrue (imageFile.exists ()); }

Mens vi gjentar oss over skjermene, oppsummerer vi alltid bredden og velger bare en maksimal høyde, ettersom skjermene sammenkobles vannrett.

Når vi går lenger, må vi lagre skjermbildet. Som i forrige eksempel kan vi bruke ImageIO.write () metode.

4. Ta et skjermbilde av en gitt GUI-komponent

Vi kan også ta et skjermbilde av en gitt brukergrensesnittkomponent.

Dimensjonene er lett tilgjengelige via getBounds () metode da hver komponent er klar over størrelsen og plasseringen.

I dette tilfellet skal vi ikke bruke Robot API. I stedet skal vi bruke maling() metoden fra Komponent klasse som vil trekke innholdet direkte inn i BufferedImage:

@Test offentlig tomrom gittComponent_whenTakeScreenshot_thenSaveToFile (komponentkomponent) kaster unntak {Rectangle componentRect = component.getBounds (); BufferedImage bufferedImage = ny BufferedImage (componentRect.width, componentRect.height, BufferedImage.TYPE_INT_ARGB); component.paint (bufferedImage.getGraphics ()); Fil imageFile = ny fil ("component-screenshot.bmp"); ImageIO.write (bufferedImage, "bmp", imageFile); assertTrue (imageFile.exists ()); }

Etter at komponenten er bundet, må vi lage BufferedImage. For dette trenger vi bredde, høyde og bildetype. I dette tilfellet bruker vi BufferedImage.TYPE_INT_ARGB som refererer til et 8-biters fargebilde.

Vi går deretter fremover for å påkalle maling() metoden for å fylle BufferedImage og det samme som i tidligere eksempler lagrer vi det i en fil med ImageIO.write () metode.

5. Konklusjon

I denne opplæringen har vi lært flere måter å ta skjermbilder ved hjelp av Java.

Som alltid er kildekoden med alle eksemplene i denne opplæringen tilgjengelig på GitHub.