Hogyan méretezhetem át a kép méretét a Java segítségével?

1. Bemutatkozás

Ebben az oktatóanyagban megtanuljuk, hogyan kell átméretezni (méretezni) a képeket a Java segítségével. Megvizsgáljuk mind az alapvető Java, mind a nyílt forráskódú, harmadik féltől származó könyvtárakat, amelyek a kép átméretezési funkcióját kínálják.

Fontos megemlíteni, hogy a képeket felfelé és lefelé is méretezhetjük. Az oktatóanyag kódmintáiban átméretezzük a képeket, mivel a gyakorlatban ez a leggyakoribb forgatókönyv.

2. Átméretezzen egy képet a Core Java segítségével

A Core Java az alábbi lehetőségeket kínálja a képek átméretezéséhez:

  • Átméretezés a használatával java.awt.Grafika2D
  • Átméretezés a használatával Image # getScaledInstance

2.1. java.awt.Grafika2D

Graphics2D a kétdimenziós alakzatok, szövegek és képek Java platformon történő megjelenítésének alapvető osztálya.

Kezdjük azzal, hogy átméretezzük a képet a Graphics2D:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) dobja az IOException {BufferedImage resizedImage = új BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = resizedImage.createGraphics (); graphics2D.drawImage (originalImage, 0, 0, targetWidth, targetHeight, null); graphics2D.dispose (); return resizedImage; }

Nézzük meg, hogyan néz ki a kép átméretezés előtt és után:

A BufferedImage.TYPE_INT_RGB paraméter jelzi a kép színmodelljét. Az elérhető értékek teljes listája elérhető a hivatalos Java-ban BufferedImage dokumentáció.

Graphics2D hívott további paramétereket fogad el RenderingHints. Használunk RenderingHints befolyásolni a különböző képfeldolgozási szempontokat, és ami a legfontosabb a képminőséget és a feldolgozási időt.

Hozzáadhatjuk a RenderingHint használni a setRenderingHint módszer:

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

A teljes lista RenderingHints megtalálható ebben az Oracle oktatóanyagban.

2.2. Image.getScaledInstance ()

Ez a megközelítés a Kép nagyon egyszerű, és kielégítő minőségű képeket készít:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) dobja az IOException {Image resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_DEFAULT); BufferedImage outputImage = új BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); outputImage.getGraphics (). drawImage (resultImage, 0, 0, null); return outputImage; }

Lássuk, mi történik egy fincsi képpel:

A méretezési mechanizmust a rendelkezésre álló megközelítések egyikének használatára is irányíthatjuk a getScaledInstance () metódus egy zászlóval, amely jelzi a kép újramintavételi igényeihez használandó algoritmus típusát:

Kép kapottImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_SMOOTH);

Az összes elérhető jelölőt a hivatalos Java Image dokumentáció írja le.

3. Imgscalr

Imgscalr használja Graphic2D a háttérben. Egyszerű API-val rendelkezik, néhány különböző módszerrel a kép átméretezéséhez.

Az Imgscalr vagy a legjobban kinéző, a leggyorsabb eredményt, vagy a kiegyensúlyozott eredményt biztosítja számunkra a választott méretezési lehetőségtől függően. Egyéb képmanipulációs funkciók is elérhetők - például a kivágáshoz és a forgatáshoz. Mutassuk meg, hogyan működik egy egyszerű példában.

Hozzáadjuk a következő Maven-függőséget:

 org.imgscalr imgscalr-lib 4.2 

Ellenőrizze a Maven Central legújabb verzióját.

Az Imgscalr használatának legegyszerűbb módja:

BufferedImage simpleResizeImage (BufferedImage originalImage, int targetWidth) dobja a Kivételt {return Scalr.resize (originalImage, targetWidth); }

Hol originalImage az a BufferedImage átméretezni és targetWidth az eredménykép szélessége. Ez a megközelítés megtartja az eredeti képarányokat és az alapértelmezett paramétereket használja - Módszer.Automatikus és Mód. AUTOMATIKUS.

Hogyan működik egy finom gyümölcs képével? Lássuk:

A könyvtár több konfigurációs lehetőséget is lehetővé tesz, és kezeli a kép átlátszóságát a háttérben.

A legfontosabb paraméterek:

  • mód - az átméretezési módok meghatározására szolgál, amelyeket az algoritmus használni fog. Például meghatározhatjuk, hogy meg akarjuk-e őrizni a kép arányait (az opciók: AUTOMATIKUS, FIT_EXACT, FIT_TO_HEIGHT és FIT_TO_WIDTH)
  • módszer - utasítja az átméretezési folyamatot úgy, hogy annak középpontjában a sebesség, a minőség vagy mindkettő álljon. A lehetséges értékek AUTOMATIKUS, KIEGÉSZÍTETT, MINŐSÉG, SPEED, ULTRA_QUALITY

Lehetőség van további átméretezési tulajdonságok meghatározására is, amelyek naplózást biztosítanak számunkra, vagy arra irányítják a könyvtárat, hogy néhány színmódosítást végezzen a képen (világosabbá, sötétebbé, szürkeárnyalatosabbá tegye stb.).

Használjuk a teljeset átméretezés () módszer paraméterezése:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) dobja a Kivételt {return Scalr.resize (originalImage, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, targetWidth, targetHeight, Scalr.OP_ANTIALIAS); }

És most megkapjuk:

Az Imgscalr működik a Java Image IO által támogatott összes fájllal - JPG, BMP, JPEG, WBMP, PNG és GIF.

4. Miniatűrkép

A Thumbnailator egy nyílt forráskódú képátméretező könyvtár a Java számára, amely progresszív bilináris méretezést használ. Támogatja a JPG, BMP, JPEG, WBMP, PNG és GIF fájlokat.

A következő Maven-függőséget hozzáadjuk projektünkhöz pom.xml:

 net.coobird thumbnailator 0.4.11 

A rendelkezésre álló függőségi verziók a Maven Central oldalon találhatók.

Nagyon egyszerű API-val rendelkezik, és lehetővé teszi számunkra, hogy a kimenet minőségét százalékban állítsuk be:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) dobja a Kivételt {ByteArrayOutputStream outputStream = new ByteArrayOutputStream (); Miniatűrök.of (originalImage) .size (targetWidth, targetHeight) .outputFormat ("JPEG") .outputQuality (1) .toOutputStream (outputStream); bájt [] adatok = outputStream.toByteArray (); ByteArrayInputStream inputStream = új ByteArrayInputStream (adatok); return ImageIO.read (inputStream); }

Nézzük meg, hogyan néz ki ez a mosolygós fénykép átméretezés előtt és után:

Lehetősége van kötegelt feldolgozásra is:

Indexképek (új fájl ("elérési út / könyvtár / könyvtár"). ListFiles ()) .size (300, 300) .outputFormat ("JPEG") .outputQuality (0.80) .toFiles (átnevezés.PREFIX_DOT_THUMBNAIL);

Mint Imgscalr, a Thumblinator a Java Image IO által támogatott összes fájllal együtt működik - JPG, BMP, JPEG, WBMP, PNG és GIF.

5. Marvin

A Marvin egy praktikus eszköz a képmanipulációhoz, és rengeteg hasznos alapvető (levágás, forgatás, ferdeség, megfordítás, méretarány) és haladó (elmosódás, domborítás, textúrázás) funkciókat kínál.

A korábbiakhoz hasonlóan hozzáadjuk a Marvin átméretezéséhez szükséges Maven-függőségeket:

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

Az elérhető Marvin függőségi verziók a Maven Central oldalán találhatók, a Marvin Plugins verzióival együtt.

A Marvin hátránya, hogy nem kínál további méretezési konfigurációt. A skálázási módszerhez egy kép és képklón is szükséges, ami kissé nehézkes:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) {MarvinImage image = új MarvinImage (originalImage); Méretarány = új skála (); skála.terhelés (); scale.setAttribute ("newWidth", targetWidth); scale.setAttribute ("newHeight", targetHeight); scale.process (image.clone (), image, null, null, false); return image.getBufferedImageNoAlpha (); }

Méretezzük át egy virág képét, és nézzük meg, hogyan megy:

6. Legjobb gyakorlat

A képfeldolgozás az erőforrások szempontjából drága művelet, így a legmagasabb minőség kiválasztása nem feltétlenül a legjobb megoldás, amikor nem igazán van rá szükségünk.

Lássuk az összes megközelítés teljesítményét. Vettünk egyet 1920 × 1920 px képet, és méretre szabta 200 × 200 képpont. A kapott megfigyelt idők a következők:

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

Továbbá, miközben meghatározza a cél kép szélességét és magasságát, figyelnünk kell a képarányra. Így a kép megőrzi eredeti arányait, és nem lesz kifeszítve.

7. Következtetés

Ez a cikk néhány képet szemléltet egy kép átméretezésére a Java-ban. Megtudtuk azt is, hogy hány különböző tényező befolyásolhatja az átméretezési folyamatot.

A teljes kódminták elérhetők a GitHubon.