Tage skærmbilleder ved hjælp af Java

1. Introduktion

I denne vejledning ser vi på et par forskellige måder at tage et screenshot på Java.

2. Tage et skærmbillede ved hjælp af Robot

I vores første eksempel skal vi tage et skærmbillede af hovedskærmen.

Til det bruger vi createScreenCapture () metode fra Robot klasse. Det tager en Rektangel som en parameter, der sætter grænserne for skærmbilledet og returnerer a BufferedImage objekt. Det BufferedImage kan yderligere bruges til at oprette en billedfil:

@Test offentlig ugyldighed givenMainScreen_whenTakeScreenshot_thenSaveToFile () kaster undtagelse {Rectangle screenRect = new Rectangle (Toolkit.getDefaultToolkit (). GetScreenSize ()); BufferedImage capture = ny robot (). CreateScreenCapture (screenRect); File imageFile = ny fil ("single-screen.bmp"); ImageIO.write (capture, "bmp", imageFile); assertTrue (imageFile .eksisterer ()); }

Skærmens dimensioner er tilgængelige via Værktøjskasse klasse ved hjælp af dens getScreenSize () metode. På systemer med flere skærme bruges den primære skærm som standard.

Efter at have fanget skærmen i Buffered Image, vi kan skrive det til filen med ImageIO.write (). For at gøre dette har vi brug for to yderligere parametre. Billedformatet og selve billedfilen. I vores eksempel vi bruger.bmp format, men andre kan lide.png, .jpg eller .gif er også tilgængelige.

3. At tage et skærmbillede af flere skærme

Det er også muligt at tage et skærmbillede af flere skærme på én gang. Ligesom med det foregående eksempel kan vi bruge createScreenCapture () metode fra Robot klasse. Men denne gang skal skærmbilledets grænser dække alle nødvendige skærme.

For at få alle skærmene bruger vi GrafikMiljø klasse og dens getScreenDevices () metode.

Dernæst henter vi grænsen for hver enkelt skærm og opretter en Rektangel der passer til dem alle:

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

Mens det gentager sig over skærmene, opsummerer vi altid bredderne og vælger kun en maksimal højde, da skærmene sammenkædes vandret.

Gå videre er vi nødt til at gemme skærmbilledet. Som i det foregående eksempel kan vi bruge ImageIO.write () metode.

4. Tage et skærmbillede af en given GUI-komponent

Vi kan også tage et screenshot af en given UI-komponent.

Dimensionerne er let tilgængelige via getBounds () metode, da hver komponent er opmærksom på dens størrelse og placering.

I dette tilfælde vil vi ikke bruge Robot API. I stedet skal vi bruge maling() metode fra Komponent klasse, der trækker indholdet direkte ind i BufferedImage:

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

Efter at komponenten er bundet, skal vi oprette BufferedImage. Til dette har vi brug for bredde, højde og billedtype. I dette tilfælde bruger vi BufferedImage.TYPE_INT_ARGB der henviser til et 8-bit farvebillede.

Vi går derefter fremad for at påberåbe os maling() metode til at udfylde BufferedImage og det samme som i tidligere eksempler gemmer vi det i en fil med ImageIO.write () metode.

5. Konklusion

I denne vejledning har vi lært flere måder, hvordan man tager skærmbilleder ved hjælp af Java.

Som altid er kildekoden med alle eksemplerne i denne vejledning tilgængelig på GitHub.