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.