Kako mogu promijeniti veličinu slike pomoću Jave?

1. Uvod

U ovom uputstvu naučit ćemo kako promijeniti veličinu (skalirati) sliku pomoću Jave. Istražit ćemo jezgre Java i otvorene biblioteke trećih strana koje nude značajku promjene veličine slike.

Važno je napomenuti da slike možemo povećavati i prema gore i prema dolje. U uzorcima koda u ovom uputstvu, veličinu slika smanjit ćemo na manje veličine, jer je to u praksi najčešći scenarij.

2. Promijenite veličinu slike koristeći Core Java

Core Java nudi sljedeće mogućnosti za promjenu veličine slika:

  • Promijeni veličinu pomoću java.awt.Graphics2D
  • Promijeni veličinu pomoću Slika # getScaledInstance

2.1. java.awt.Graphics2D

Grafika2D je osnovna klasa za prikazivanje dvodimenzionalnih oblika, teksta i slika na Java platformi.

Počnimo s promjenom veličine slike pomoću Grafika2D:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) baca 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 (); povratak resizedImage; }

Pogledajmo kako slika izgleda prije i nakon promjene veličine:

The BufferedImage.TYPE_INT_RGB parametar označava model boje slike. Potpuni popis dostupnih vrijednosti dostupan je u službenoj Javi Slika u baferu dokumentacija.

Grafika2D prihvaća dodatne parametre pozvane RenderingHints. Koristimo RenderingHints utjecati na različite aspekte obrade slike i što je najvažnije na kvalitetu slike i vrijeme obrade.

Možemo dodati a RenderingHint koristiti setRenderingHint metoda:

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

Potpuni popis RenderingHints možete pronaći u ovom vodiču za Oracle.

2.2. Image.getScaledInstance ()

Ovaj pristup korištenjem Slika je vrlo jednostavan i daje slike zadovoljavajuće kvalitete:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) baca IOException {Image resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_DEFAULT); BufferedImage outputImage = nova BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); outputImage.getGraphics (). drawImage (rezultatImage, 0, 0, null); vrati outputImage; }

Pogledajmo što će se dogoditi sa slikom nečega ukusnog:

Također možemo uputiti mehanizam skaliranja da koristi jedan od dostupnih pristupa pružajući getScaledInstance () metoda sa zastavicom koja označava vrstu algoritma koji će se koristiti za potrebe ponovnog uzorkovanja slika:

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

Sve dostupne zastavice opisane su u službenoj dokumentaciji Java Image.

3. Imgscalr

Imgscalr koristi Graphic2D u pozadini. Ima jednostavan API s nekoliko različitih metoda za promjenu veličine slike.

Imgscalr nam daje ili najljepši rezultat, najbrži rezultat ili uravnoteženi rezultat, ovisno o odabranoj opciji skaliranja. Dostupne su i druge značajke za manipulaciju slikama - poput onih za obrezivanje i rotaciju. Pokažimo kako to funkcionira na jednostavnom primjeru.

Dodati ćemo sljedeću Mavenovu ovisnost:

 org.imgscalr imgscalr-lib 4.2 

Najnoviju verziju potražite u Maven Central.

Najjednostavniji način korištenja Imgscalra je:

BufferedImage simpleResizeImage (BufferedImage originalImage, int targetWidth) baca Exception {return Scalr.resize (originalImage, targetWidth); }

Gdje originalImage je Slika u baferu za promjenu veličine i targetWidth je širina slike rezultata. Ovaj pristup zadržat će izvorne proporcije slike i koristiti zadane parametre - Metoda.AUTOMATSKA i Način rada.AUTOMATSKI.

Kako je to sa slikom ukusnog voća? Da vidimo:

Biblioteka također omogućava višestruke mogućnosti konfiguracije i u pozadini obrađuje prozirnost slike.

Najvažniji parametri su:

  • način rada - koristi se za definiranje načina promjene veličine koje će algoritam koristiti. Na primjer, možemo definirati želimo li zadržati proporcije slike (opcije su AUTOMATSKI, FIT_EXACT, FIT_TO_HEIGHT i FIT_TO_WIDTH)
  • metoda - upućuje postupak promjene veličine tako da je fokus usmjeren na brzinu, kvalitetu ili oboje. Moguće vrijednosti su AUTOMATSKO, Uravnoteženo, KVALITETA, BRZINA, ULTRA_KVALITETA

Također je moguće definirati dodatna svojstva promjene veličine koja će nam omogućiti bilježenje ili usmjeravati knjižnicu da izvrši neke izmjene u boji na slici (učini je svjetlijom, tamnijom, sive boje i tako dalje).

Iskoristimo puni promijeniti veličinu () parametrizacija metode:

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

A sada dobivamo:

Imgscalr radi sa svim datotekama koje podržava Java Image IO - JPG, BMP, JPEG, WBMP, PNG i GIF.

4. Thumbnailator

Thumbnailator je knjižnica za promjenu veličine slike otvorenog koda za Javu koja koristi progresivno bilinearno skaliranje. Podržava JPG, BMP, JPEG, WBMP, PNG i GIF.

Uključit ćemo ga u naš projekt dodavanjem sljedeće ovisnosti o Mavenu u našu pom.xml:

 sličica net.coobird 0.4.11 

Dostupne verzije ovisnosti mogu se naći na Maven Central.

Ima vrlo jednostavan API i omogućuje nam postavljanje kvalitete izlaza u postocima:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) baca iznimku {ByteArrayOutputStream outputStream = new ByteArrayOutputStream (); Minijature.of (originalImage) .size (targetWidth, targetHeight) .outputFormat ("JPEG") .outputQuality (1) .toOutputStream (outputStream); bajt [] podaci = outputStream.toByteArray (); ByteArrayInputStream inputStream = novi ByteArrayInputStream (podaci); return ImageIO.read (inputStream); }

Pogledajmo kako izgleda ova nasmijana fotografija prije i nakon promjene veličine:

Također ima mogućnost skupne obrade:

Minijature.of (nova datoteka ("put / do / direktorija"). ListFiles ()) .size (300, 300) .outputFormat ("JPEG") .outputQuality (0,80) .toFiles (Preimenuj.PREFIX_DOT_THUMBNAIL);

Kao Imgscalr, Thumblinator radi sa svim datotekama koje podržava Java Image IO - JPG, BMP, JPEG, WBMP, PNG i GIF.

5. Marvin

Marvin je praktičan alat za manipulaciju slikama i nudi puno korisnih osnovnih (obrezivanje, rotiranje, iskrivljenje, okretanje, skaliranje) i naprednih (zamućivanje, utiskivanje, teksturiranje) značajki.

Kao i prije, dodati ćemo Mavenove ovisnosti potrebne za Marvinovo mijenjanje veličine:

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

Dostupne verzije ovisnosti o Marvinu mogu se naći na Maven Central, zajedno s verzijama dodataka Marvin.

Loša strana Marvina je što ne nudi dodatnu konfiguraciju skaliranja. Također, metoda skale zahtijeva sliku i klon slike koji su pomalo glomazni:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) {MarvinImage image = novi MarvinImage (originalImage); Skala razmjera = nova Skala (); scale.load (); scale.setAttribute ("newWidth", targetWidth); scale.setAttribute ("newHeight", targetHeight); scale.process (image.clone (), image, null, null, false); vratiti sliku.getBufferedImageNoAlpha (); }

Promijenimo sada veličinu slike cvijeta i pogledajte kako to ide:

6. Najbolja praksa

Obrada slika je skupa operacija u smislu resursa, tako da odabir najkvalitetnije nije nužno najbolja opcija kada nam to zapravo nije potrebno.

Pogledajmo izvedbu svih pristupa. Uzeli smo jedan 1920 × 1920 px sliku i prilagodio je na 200 × 200 px. Rezultirajuća promatrana vremena su kako slijedi:

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

Također, dok definirate ciljanu širinu i visinu slike, trebali bismo obratiti pažnju na omjer slike. Na taj će način slika sačuvati izvorne proporcije i neće se rastezati.

7. Zaključak

Ovaj je članak ilustrirao nekoliko načina za promjenu veličine slike na Javi. Također smo saznali koliko različitih čimbenika može utjecati na postupak promjene veličine.

Cjeloviti uzorci koda dostupni su na GitHubu.