Hvordan kan jeg endre størrelse på et bilde ved hjelp av Java?

1. Introduksjon

I denne opplæringen skal vi lære å endre størrelse (skalere) et bilde ved hjelp av Java. Vi vil utforske både kjerne Java og open source tredjepartsbiblioteker som tilbyr bildestørrelsesfunksjonen.

Det er viktig å nevne at vi kan skalere bilder både opp og ned. I kodeeksemplene i denne opplæringen endrer vi størrelsen på bilder til mindre størrelser, siden det i praksis er det vanligste scenariet.

2. Endre størrelsen på et bilde ved hjelp av Core Java

Core Java tilbyr følgende alternativer for å endre størrelse på bilder:

  • Endre størrelse ved hjelp av java.awt.Graphics2D
  • Endre størrelse på Bilde # getScaledInstance

2.1. java.awt.Graphics2D

Grafikk2D er den grunnleggende klassen for gjengivelse av todimensjonale former, tekst og bilder på Java-plattformen.

La oss starte med å endre størrelse på et bilde ved hjelp av Grafikk2D:

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 (); endre størrelse på bilde; }

La oss se hvordan bildet ser ut før og etter endring av størrelse:

De BufferedImage.TYPE_INT_RGB parameter angir fargemodellen på bildet. En fullstendig liste over tilgjengelige verdier er tilgjengelig i det offisielle Java BufferedImage dokumentasjon.

Grafikk2D godtar flere parametere som kalles Gjengivelsestips. Vi bruker Gjengivelsestips å påvirke ulike bildebehandlingsaspekter og viktigst av alt bildekvalitet og behandlingstid.

Vi kan legge til en Gjengivelsestips bruker setRenderingHint metode:

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

En full liste over Gjengivelsestips kan du finne i denne Oracle-opplæringen.

2.2. Image.getScaledInstance ()

Denne tilnærmingen bruker Bilde er veldig enkelt og gir bilder av 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 bilde, 0, 0, null); return outputImage; }

La oss se hva som skjer med et bilde av noe deilig:

Vi kan også dirigere skaleringsmekanismen til å bruke en av de tilgjengelige tilnærmingene ved å tilby getScaledInstance () metode med et flagg som indikerer hvilken type algoritme som skal brukes til våre behov for bildesampling:

Image resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_SMOOTH);

Alle tilgjengelige flagg er beskrevet i den offisielle Java Image-dokumentasjonen.

3. Imgscalr

Imgscalr bruker Grafisk2D i bakgrunnen. Den har en enkel API med noen forskjellige metoder for å endre størrelse på bilder.

Imgscalr gir oss enten det flotteste resultatet, det raskeste resultatet eller et balansert resultat, avhengig av skaleringsalternativet vi velger. Andre bildemanipuleringsfunksjoner er også tilgjengelige - som for beskjæring og rotasjon. La oss vise hvordan det fungerer i et enkelt eksempel.

Vi legger til følgende Maven-avhengighet:

 org.imgscalr imgscalr-lib 4.2 

Sjekk Maven Central for den nyeste versjonen.

Den enkleste måten å bruke Imgscalr er:

BufferedImage simpleResizeImage (BufferedImage originalImage, int targetWidth) kaster Unntak {retur Scalr.resize (originalImage, targetWidth); }

Hvor originalImage er den BufferedImage å bli endret og targetWidth er bredden på et resultatbilde. Denne tilnærmingen vil beholde de opprinnelige bildeproporsjoner og bruke standardparametere Metode. AUTOMATISK og Mode. AUTOMATISK.

Hvordan gjør det med et bilde av deilig frukt? La oss se:

Biblioteket tillater også flere konfigurasjonsalternativer, og det håndterer bildetransparens i bakgrunnen.

De viktigste parametrene er:

  • modus - brukes til å definere størrelsesmodusene som algoritmen vil bruke. For eksempel kan vi definere om vi vil beholde proporsjoner av bildet (alternativene er AUTOMATIC, FIT_EXACT, FIT_TO_HEIGHT og FIT_TO_WIDTH)
  • metode - instruerer endringsprosessen slik at fokuset er på hastighet, kvalitet eller begge deler. Mulige verdier er AUTOMATISK, BALANSERT, KVALITET, HASTIGHET, ULTRA_QUALITY

Det er også mulig å definere ytterligere størrelsesegenskaper som vil gi oss loggføring eller lede biblioteket til å gjøre noen fargemodifikasjoner på bildet (gjør det lysere, mørkere, gråtoner og så videre).

La oss bruke det fulle endre størrelse () metode parameterisering:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) kaster Unntak {retur Scalr.resize (originalImage, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, targetWidth, targetHeight, Scalr.OP_ANTIALIAS) }

Og nå får vi:

Imgscalr fungerer med alle filer som støttes av Java Image IO - JPG, BMP, JPEG, WBMP, PNG og GIF.

4. Miniatyrbilde

Thumbnailator er et åpen kildekode for bildestørrelsesbibliotek for Java som bruker progressiv bilinær skalering. Den støtter JPG, BMP, JPEG, WBMP, PNG og GIF.

Vi vil inkludere det i prosjektet vårt ved å legge til følgende Maven-avhengighet til vår pom.xml:

 net.coobird miniatyrbilde 0.4.11 

Tilgjengelige avhengighetsversjoner finnes på Maven Central.

Den har en veldig enkel API og lar oss sette utgangskvaliteten i prosent:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) kaster Unntak {ByteArrayOutputStream outputStream = new 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); }

La oss se hvordan dette smilende fotografiet ser ut før og etter endring av størrelse:

Det har også et alternativ for batchbehandling:

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

Som Imgscalr fungerer Thumblinator med alle filer som støttes av Java Image IO - JPG, BMP, JPEG, WBMP, PNG og GIF.

5. Marvin

Marvin er et praktisk verktøy for bildemanipulering, og det tilbyr mange nyttige grunnleggende funksjoner (beskjæring, rotering, skjevhet, vending, skalering) og avanserte funksjoner (uskarphet, preging, strukturering).

Som før vil vi legge til Maven-avhengigheter som trengs for å endre størrelse på Marvin:

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

Tilgjengelige Marvin-avhengighetsversjoner finnes på Maven Central, sammen med Marvin Plugins-versjonene.

Ulempen med Marvin er at den ikke tilbyr en ekstra skaleringskonfigurasjon. Skalemetoden krever også et bilde og en klon som er litt tungvint:

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

La oss nå endre størrelse på et bilde av en blomst og se hvordan det går:

6. Beste praksis

Bildebehandling er en kostbar operasjon når det gjelder ressurser, så å velge høyeste kvalitet er ikke nødvendigvis det beste alternativet når vi egentlig ikke trenger det.

La oss se ytelsen til alle tilnærmingene. Vi tok en 1920 × 1920 px bildet, og skalert det til 200 × 200 px. De resulterende observerte tidene er som følger:

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

Mens du definerer målbildebredden og -høyden, vi bør ta hensyn til bildeforholdet. På denne måten vil bildet bevare sine opprinnelige proporsjoner og vil ikke bli strukket.

7. Konklusjon

Denne artikkelen illustrerte noen måter å endre størrelse på et bilde i Java. Vi lærte også hvor mange forskjellige faktorer som kan påvirke størrelsesprosessen.

Komplette kodeeksempler er tilgjengelig på GitHub.