Hvordan kan jeg ændre størrelse på et billede ved hjælp af Java?

1. Introduktion

I denne vejledning vil vi lære at ændre størrelse (skalere) et billede ved hjælp af Java. Vi udforsker både kerne-Java og open source tredjepartsbiblioteker, der tilbyder billedstørrelsesfunktionen.

Det er vigtigt at nævne, at vi kan skalere billeder både op og ned. I kodeeksemplerne i denne vejledning ændrer vi størrelsen på billeder til mindre størrelser, da det i praksis er det mest almindelige scenario.

2. Ændr størrelsen på et billede ved hjælp af Core Java

Core Java tilbyder følgende muligheder for at ændre størrelse på billeder:

  • Tilpas størrelse ved hjælp af java.awt.Grafik2D
  • Tilpas størrelse ved hjælp af Billede # getScaledInstance

2.1. java.awt.Grafik2D

Grafik2D er den grundlæggende klasse til gengivelse af 2-dimensionelle figurer, tekst og billeder på Java-platformen.

Lad os starte med at ændre størrelsen på et billede ved hjælp af Grafik2D:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) kaster IOException {BufferedImage resizedImage = new BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = resizedImage.createGraphics (); graphics2D.drawImage (originalImage, 0, 0, targetWidth, targetHeight, null); graphics2D.dispose (); Tilbage resizedImage; }

Lad os se, hvordan billedet ser ud før og efter størrelse:

Det BufferedImage.TYPE_INT_RGB parameter angiver billedets farvemodel. En komplet liste over tilgængelige værdier er tilgængelig i det officielle Java BufferedImage dokumentation.

Grafik2D accepterer yderligere kaldte parametre Renderingstips. Vi bruger Renderingstips at påvirke forskellige billedbehandlingsaspekter og vigtigst af alt billedkvalitet og behandlingstid.

Vi kan tilføje en Gengivelsestip bruger setRenderingHint metode:

graphics2D.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

En komplet liste over Renderingstips kan findes i denne Oracle-vejledning.

2.2. Image.getScaledInstance ()

Denne tilgang ved hjælp af Billede er meget enkel og producerer billeder af tilfredsstillende kvalitet:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) kaster IOException {Image resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_DEFAULT); BufferedImage outputImage = ny BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); outputImage.getGraphics (). drawImage (resulterende billede, 0, 0, null); return outputImage; }

Lad os se, hvad der sker med et billede af noget lækkert:

Vi kan også dirigere skaleringsmekanismen til at bruge en af ​​de tilgængelige tilgange ved at levere getScaledInstance () metode med et flag, der angiver den type algoritme, der skal bruges til vores billedsamplingsbehov:

Billede, resulterende billede = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_SMOOTH);

Alle tilgængelige flag er beskrevet i den officielle Java Image-dokumentation.

3. Imgscalr

Imgscalr bruger Grafisk2D i baggrunden. Det har en simpel API med et par forskellige metoder til billedstørrelse.

Imgscalr giver os enten det bedste resultat, det hurtigste resultat eller et afbalanceret resultat afhængigt af den skaleringsindstilling, vi vælger. Andre billedmanipulationsfunktioner er også tilgængelige - som dem til beskæring og rotation. Lad os vise, hvordan det fungerer i et simpelt eksempel.

Vi tilføjer følgende Maven-afhængighed:

 org.imgscalr imgscalr-lib 4.2 

Tjek Maven Central for den nyeste version.

Den enkleste måde at bruge Imgscalr på er:

BufferedImage simpleResizeImage (BufferedImage originalImage, int targetWidth) kaster Undtagelse {return Scalr.resize (originalImage, targetWidth); }

Hvor originalImage er BufferedImage skal ændres og targetWidth er bredden på et resultatbillede. Denne tilgang holder de originale billedforhold og bruger standardparametre - Metode. AUTOMATISK og Mode. AUTOMATISK.

Hvordan fungerer det med et billede af lækker frugt? Lad os se:

Biblioteket tillader også flere konfigurationsindstillinger, og det håndterer gennemsigtighed i billeder i baggrunden.

De vigtigste parametre er:

  • mode - bruges til at definere størrelsesændringstilstande, som algoritmen vil bruge. For eksempel kan vi definere, om vi vil beholde proportioner af billedet (valgmulighederne er AUTOMATIC, FIT_EXACT, FIT_TO_HEIGHT og FIT_TO_WIDTH)
  • metode - instruerer størrelsesændringsprocessen, så dens fokus er på hastighed, kvalitet eller begge dele. Mulige værdier er AUTOMATISK, BALANCERET, KVALITET, HASTIGHED, ULTRA_QUALITY

Det er også muligt at definere yderligere størrelsesegenskaber, der giver os logning eller dirigerer biblioteket til at foretage nogle farveændringer på billedet (gør det lysere, mørkere, gråtoner osv.).

Lad os bruge det fulde ændre størrelse () metode parametrering:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) throw Exception {return Scalr.resize (originalImage, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, targetWidth, targetHeight, Scalr.OP_ANTIALIAS); }

Og nu får vi:

Imgscalr fungerer med alle filer, der understøttes af Java Image IO - JPG, BMP, JPEG, WBMP, PNG og GIF.

4. Miniaturer

Thumbnailator er et open source-billedstørrelsesbibliotek til Java, der bruger progressiv bilinær skalering. Det understøtter JPG, BMP, JPEG, WBMP, PNG og GIF.

Vi inkluderer det i vores projekt ved at tilføje følgende Maven-afhængighed til vores pom.xml:

 net.coobird miniaturebillede 0.4.11 

Tilgængelige afhængighedsversioner kan findes på Maven Central.

Det har en meget enkel API og giver os mulighed for at indstille outputkvalitet i procent:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) kaster Undtagelse {ByteArrayOutputStream outputStream = ny ByteArrayOutputStream (); Thumbnails.of (originalImage) .størrelse (targetWidth, targetHeight) .outputFormat ("JPEG") .outputQuality (1) .toOutputStream (outputStream); byte [] data = outputStream.toByteArray (); ByteArrayInputStream inputStream = ny ByteArrayInputStream (data); returner ImageIO.read (inputStream); }

Lad os se, hvordan dette smilende fotografi ser ud før og efter størrelse:

Det har også en mulighed for batchbehandling:

Thumbnails.of (ny fil ("sti / til / bibliotek"). ListFiles ()) .størrelse (300, 300) .outputFormat ("JPEG") .outputQuality (0,80) .toFiles (Omdøb.PREFIX_DOT_THUMBNAIL);

Som Imgscalr fungerer Thumblinator med alle filer, der understøttes af Java Image IO - JPG, BMP, JPEG, WBMP, PNG og GIF.

5. Marvin

Marvin er et praktisk værktøj til billedmanipulation, og det tilbyder en masse nyttige grundlæggende funktioner (beskæring, rotering, skævhed, vipning, skalering) og avancerede (sløring, prægning, strukturering) funktioner.

Som før tilføjer vi Maven-afhængigheder, der er nødvendige for Marvin-ændring af størrelse:

 com.github.downgoon marvin 1.5.5 pom com.github.downgoon MarvinPlugins 1.5.5 

Tilgængelige Marvin-afhængighedsversioner kan findes på Maven Central sammen med Marvin Plugins-versionerne.

Ulempen ved Marvin er, at den ikke tilbyder en ekstra skaleringskonfiguration. Skalemetoden kræver også et billede og en billedklon, der er lidt besværlig:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) {MarvinImage image = new MarvinImage (originalImage); Skala skala = ny skala (); scale.load (); scale.setAttribute ("newWidth", targetWidth); scale.setAttribute ("newHeight", targetHeight); scale.process (image.clone (), image, null, null, false); returner image.getBufferedImageNoAlpha (); }

Lad os nu ændre størrelsen på et billede af en blomst og se, hvordan det går:

6. Bedste praksis

Billedbehandling er en dyre operation med hensyn til ressourcer, så at vælge den højeste kvalitet er ikke nødvendigvis den bedste mulighed, når vi ikke rigtig har brug for det.

Lad os se udførelsen af ​​alle tilgange. Vi tog en 1920 × 1920 px billede og skaleret det til 200 × 200 px. De resulterende observerede tider er som følger:

  • java.awt.Grafik2D - 34 ms
  • Image.getScaledInstance () - 235 ms
  • Imgscalr - 143ms
  • Miniaturer - 547ms
  • Marvin - 361 ms

Mens du definerer målbilledets bredde og højde, vi skal være opmærksomme på billedformatet. På denne måde bevarer billedet dets oprindelige proportioner og strækkes ikke.

7. Konklusion

Denne artikel illustrerede et par måder at ændre størrelsen på et billede i Java. Vi lærte også, hvor mange forskellige faktorer der kan påvirke størrelsesprocessen.

Komplette kodeeksempler er tilgængelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found