Ako môžem zmeniť veľkosť obrázka pomocou jazyka Java?

1. Úvod

V tomto výučbe sa naučíme, ako zmeniť veľkosť (mierku) obrázka pomocou Javy. Preskúmame základné knižnice Java aj otvorené knižnice tretích strán, ktoré ponúkajú funkciu zmeny veľkosti obrázka.

Je dôležité spomenúť, že môžeme zväčšovať a zmenšovať obrázky. V ukážkach kódu v tomto tutoriále zmeníme veľkosť obrázkov na menšie veľkosti, pretože v praxi ide o najbežnejší scenár.

2. Zmena veľkosti obrázka pomocou nástroja Core Java

Core Java ponúka nasledujúce možnosti zmeny veľkosti obrázkov:

  • Zmeniť veľkosť pomocou java.awt.Graphics2D
  • Zmeniť veľkosť pomocou Obrázok # getScaledInstance

2.1. java.awt.Graphics2D

Graphics2D je základná trieda pre vykreslenie dvojrozmerných tvarov, textu a obrázkov na platforme Java.

Začnime zmenou veľkosti obrázka pomocou Graphics2D:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) hodí IOException {BufferedImage resizedImage = nový BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = resizedImage.createGraphics (); graphics2D.drawImage (originalImage, 0, 0, targetWidth, targetHeight, null); graphics2D.dispose (); návrat resizedImage; }

Pozrime sa, ako obrázok vyzerá pred a po zmene veľkosti:

The BufferedImage.TYPE_INT_RGB parameter označuje farebný model obrázka. Celý zoznam dostupných hodnôt je k dispozícii v oficiálnej prostredí Java BufferedImage dokumentácia.

Graphics2D prijíma ďalšie volané parametre RenderingHints. Používame RenderingHints ovplyvňovať rôzne aspekty spracovania obrazu a hlavne kvalitu obrazu a čas spracovania.

Môžeme pridať a RenderingHint pomocou setRenderingHint metóda:

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

Celý zoznam RenderingHints nájdete v tomto výučbe Oracle.

2.2. Image.getScaledInstance ()

Tento prístup využíva Obrázok je veľmi jednoduchý a vytvára obrázky vyhovujúcej kvality:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) vyvolá IOException {Image resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_DEFAULT); BufferedImage outputImage = nový BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); outputImage.getGraphics (). drawImage (resultImage, 0, 0, null); návrat outputImage; }

Pozrime sa, čo sa stane s obrázkom niečoho báječného:

Mechanizmus zmeny mierky môžeme tiež nasmerovať tak, aby používal jeden z dostupných prístupov poskytovaním getScaledInstance () metóda s príznakom, ktorý označuje typ algoritmu, ktorý sa má použiť pre naše potreby vzorkovania obrázkov:

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

Všetky dostupné príznaky sú popísané v oficiálnej dokumentácii Java Image.

3. Imgscalr

Imgscalr používa Graphic2D v pozadí. Má jednoduché API s niekoľkými rôznymi metódami na zmenu veľkosti obrázkov.

Imgscalr nám poskytuje buď najlepšie vyzerajúci výsledok, najrýchlejší výsledok alebo vyrovnaný výsledok v závislosti na zvolenej možnosti zmeny mierky. K dispozícii sú aj ďalšie funkcie na manipuláciu s obrázkami - napríklad funkcie na orezávanie a rotáciu. Ukážme si, ako to funguje, na jednoduchom príklade.

Pridáme nasledujúcu závislosť Maven:

 org.imgscalr imgscalr-lib 4.2 

Skontrolujte najnovšiu verziu Maven Central.

Najjednoduchší spôsob použitia Imgscalru je:

BufferedImage simpleResizeImage (BufferedImage originalImage, int targetWidth) vyvolá výnimku {return Scalr.resize (originalImage, targetWidth); }

Kde originalImage je BufferedImage zmeniť veľkosť a targetWidth je šírka výsledného obrázka. Tento prístup zachová pôvodné proporcie obrazu a použije predvolené parametre - Metóda. AUTOMATICKÉ a Režim. AUTOMATICKÝ.

Ako je to s obrázkom chutného ovocia? Pozrime sa:

Knižnica tiež umožňuje viac možností konfigurácie a zaobchádza s priehľadnosťou obrazu na pozadí.

Najdôležitejšie parametre sú:

  • režim - slúži na definovanie režimov zmeny veľkosti, ktoré bude algoritmus používať. Napríklad môžeme definovať, či chceme zachovať proporcie obrázka (možnosti sú AUTOMATIC, FIT_EXACT, FIT_TO_HEIGHT a FIT_TO_WIDTH)
  • metóda - dá pokyn na zmenu veľkosti tak, aby sa zameriaval na rýchlosť, kvalitu alebo oboje. Možné hodnoty sú AUTOMATICKÉ, VYVÁŽENÉ, KVALITNÉ, RÝCHLOSTNÉ, ULTRA_KVALITNÉ

Je tiež možné definovať ďalšie vlastnosti zmeny veľkosti, ktoré nám poskytnú logovanie, alebo nasmerovať knižnicu na niektoré farebné úpravy obrázka (aby bol svetlejší, tmavší, v odtieňoch sivej atď.).

Využime naplno zmeniť veľkosť () parametrizácia metódy:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) vyvolá výnimku {return Scalr.resize (originalImage, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, targetWidth, targetHeight, Scalr.OP_ANTIALIAS); }

A teraz dostaneme:

Imgscalr pracuje so všetkými súbormi podporovanými programom Java Image IO - JPG, BMP, JPEG, WBMP, PNG a GIF.

4. Miniatúrnik

Thumbnailator je open-source knižnica na zmenu veľkosti obrázkov pre Javu, ktorá využíva progresívne bilineárne škálovanie. Podporuje formáty JPG, BMP, JPEG, WBMP, PNG a GIF.

Zahrnieme to do nášho projektu pridaním nasledujúcej závislosti Maven do našej pom.xml:

 miniatúrny net.coobird 0.4.11 

Dostupné verzie závislostí nájdete na serveri Maven Central.

Má veľmi jednoduché API a umožňuje nám nastaviť kvalitu výstupu v percentách:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) vyvolá výnimku {ByteArrayOutputStream outputStream = nový ByteArrayOutputStream (); Thumbnails.of (originalImage) .size (targetWidth, targetHeight) .outputFormat ("JPEG") .outputQuality (1) .toOutputStream (outputStream); byte [] data = outputStream.toByteArray (); ByteArrayInputStream inputStream = nový ByteArrayInputStream (údaje); vrátiť ImageIO.read (inputStream); }

Pozrime sa, ako táto usmievavá fotografia vyzerá pred a po zmene veľkosti:

Má tiež možnosť dávkového spracovania:

Thumbnails.of (new File ("path / to / directory"). ListFiles ()) .size (300, 300) .outputFormat ("JPEG") .outputQuality (0,80) .toFiles (Rename.PREFIX_DOT_THUMBNAIL);

Ako Imgscalr pracuje Thumblinator so všetkými súbormi podporovanými Java Image IO - JPG, BMP, JPEG, WBMP, PNG a GIF.

5. Marvin

Marvin je užitočný nástroj na manipuláciu s obrázkami a ponúka veľa užitočných základných funkcií (orezanie, otočenie, skosenie, prevrátenie, zmenšenie alebo zmenšenie) a pokročilých funkcií (rozmazanie, reliéf, textúra).

Rovnako ako predtým pridáme závislosti Maven potrebné na zmenu veľkosti Marvina:

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

Dostupné verzie závislostí od Marvina nájdete na Maven Central spolu s verziami doplnkov Marvin.

Nevýhodou Marvina je, že neponúka ďalšiu konfiguráciu škálovania. Metóda mierky tiež vyžaduje obraz a obrazový klon, ktorý je trochu ťažkopádny:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) {MarvinImage image = nový MarvinImage (originalImage); Scale scale = new Scale (); scale.load (); scale.setAttribute ("newWidth", targetWidth); scale.setAttribute ("newHeight", targetHeight); scale.process (image.clone (), image, null, null, false); vrátiť image.getBufferedImageNoAlpha (); }

Poďme teraz zmeniť veľkosť obrázka kvetu a uvidíme, ako to pôjde:

6. Osvedčený postup

Spracovanie obrazu je nákladná operácia z hľadiska zdrojov, takže výber najvyššej kvality nemusí byť nevyhnutne najlepšou voľbou, keď to skutočne nepotrebujeme.

Pozrime sa na výkonnosť všetkých prístupov. Jeden sme si vzali 1920 × 1920 px obrázok a zmenšil ho na 200 × 200 px. Výsledné pozorované časy sú nasledujúce:

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

Pri definovaní šírky a výšky cieľového obrázka mali by sme venovať pozornosť pomeru strán obrazu. Takto si obrázok zachová svoje pôvodné proporcie a nebude sa tiahnuť.

7. Záver

Tento článok ilustroval niekoľko spôsobov, ako zmeniť veľkosť obrázka v prostredí Java. Dozvedeli sme sa tiež, koľko rôznych faktorov môže ovplyvniť proces zmeny veľkosti.

Kompletné ukážky kódu sú k dispozícii na GitHub.