Képek használata Java-ban

1. Áttekintés

Ebben az oktatóanyagban megnézünk néhány rendelkezésre álló képfeldolgozó könyvtárat, és egyszerű képfeldolgozási műveletet hajtunk végre - képet töltünk és alakzatot rajzolunk rá.

Kipróbáljuk az AWT (és egy kis Swing) könyvtárat, az ImageJ, az OpenIMAJ és a TwelveMonkeys könyvtárat.

2. AWT

Az AWT egy beépített Java könyvtár, amely lehetővé teszi a felhasználó számára a megjelenítéshez kapcsolódó egyszerű műveletek végrehajtását, például ablak létrehozása, gombok és hallgatók meghatározása stb. Olyan módszereket is tartalmaz, amelyek lehetővé teszik a felhasználók számára képek szerkesztését. Nem igényel telepítést, mivel Java-val szállítják.

2.1. Kép betöltése

Az első dolog a BufferedImage objektum a lemezmeghajtónkon elmentett képről:

Karakterlánc imagePath = "elérési út / a / a / képedhez.jpg"; BufferedImage myPicture = ImageIO.read (új fájl (imagePath)); 

2.2. Kép szerkesztése

Alakzat rajzolásához a képen használnunk kell Grafika betöltött képhez kapcsolódó objektum. Grafika Az objektum az alapvető renderelési műveletek elvégzéséhez szükséges tulajdonságokat foglalja magában. Graphics2D egy osztály kiterjesztése Grafika. Több irányítást biztosít a kétdimenziós alakzatok felett.

Ebben a konkrét esetben szükségünk van Graphic2D kiterjeszteni az alak szélességét, hogy jól látható legyen. S-jének növelésével érjük eltroke ingatlan. Ezután beállítunk egy színt, és egy téglalapot rajzolunk úgy, hogy az alak tíz képpont legyen a kép határától:

Graphics2D g = (Graphics2D) myPicture.getGraphics (); g.setStroke (új BasicStroke (3)); g.setColor (Szín.BLUE); g.drawRect (10, 10, myPicture.getWidth () - 20, myPicture.getHeight () - 20); 

2.3. Kép megjelenítése

Most, hogy rajzoltunk valamit a képünkre, szeretnénk megjeleníteni. Megtehetjük Swing könyvtár objektumok használatával. Először létrehozunk JLabel objektum, amely a szöveg vagy / és kép megjelenítési területét képviseli:

JLabel picLabel = új JLabel (új ImageIcon (myPicture));

Ezután adjuk hozzá JLabel nak nek JPanel, amelyet úgy kezelhetünk Java alapú GUI:

JPanel jPanel = új JPanel (); jPanel.add (picLabel);

Végül mindent hozzáadunk JFrame amely a képernyőn megjelenő ablak. Be kell állítanunk a méretet, hogy ne kelljen ezt az ablakot kibővítenünk a program futtatásakor:

JFrame f = új JFrame (); f.setSize (új dimenzió (myPicture.getWidth (), myPicture.getHeight ())); f.add (jPanel); f.setVisible (true);

3. KépJ

Az ImageJ egy Java-alapú szoftver, amelyet képek kezelésére hoztak létre. Elég sok pluginja van, elérhető itt. Csak API-t fogunk használni, mivel magunk akarjuk elvégezni a feldolgozást.

Ez meglehetősen hatékony könyvtár, jobb, mint a Swing és az AWT, mivel létrehozásának célja a képfeldolgozás volt, nem pedig a GUI műveletek. A beépülő modulok sok szabadon használható algoritmust tartalmaznak, ami jó, ha meg akarjuk tanulni a képfeldolgozást és gyorsan megnézzük az eredményeket, nem pedig matematikai és optimalizálási problémákat oldunk meg az IP algoritmusok alatt.

3.1. Maven-függőség

Az ImageJ használatának megkezdéséhez egyszerűen adjon hozzá egy függőséget a projektjéhez pom.xml fájl:

 net.imagej ij 1,51h 

A legújabb verziót a Maven tárházban találja meg.

3.2. Kép betöltése

A kép betöltéséhez használnia kell a openImage () statikus módszer, tól IJ osztály:

ImagePlus imp = IJ.openImage ("elérési út / a / te / képedhez.jpg");

3.3. Kép szerkesztése

Kép szerkesztéséhez a ImageProcessor objektum hozzánk csatolva ImagePlus tárgy. Gondolj arra, mint kb Grafika objektum az AWT-ben:

ImageProcessor ip = imp.getProcessor (); ip.setColor (Color.BLUE); ip.setLineWidth (4); ip.drawRect (10, 10, imp.getWidth () - 20, imp.getHeight () - 20);

3.4. Kép megjelenítése

Csak telefonálnia kell előadás() a metódusa ImagePlus tárgy:

imp.show ();

4. OpenIMAJ

Az OpenIMAJ olyan Java könyvtárakból áll, amelyek nemcsak a számítógépes látás és videó feldolgozásra összpontosítanak, hanem gépi tanulásra, hangfeldolgozásra, a Hadoop-tal való együttműködésre és még sok másra is. Az OpenIMAJ projekt minden része megtalálható itt, a „Modulok” részben. Csak a képfeldolgozó részre van szükségünk.

4.1. Maven-függőség

Az OpenIMAJ használatának megkezdéséhez egyszerűen adjon hozzá egy függőséget a projektjéhez pom.xml fájl:

 org.openimaj core-image 1.3.5 

A legújabb kiadást itt találja.

4.1. Kép betöltése

Kép betöltéséhez használja a ImageUtilities.readMBF () módszer:

MBFImage image = ImageUtilities.readMBF (új fájl ("elérési út / az / a / képedhez.jpg")); 

Az MBF a többsávos lebegőpontos képet jelenti (RGB ebben a példában, de ez nem az egyetlen módja a színek ábrázolásának).

4.2. Kép szerkesztése

A téglalap megrajzolásához meg kell határoznunk az alakját, amely 4 pontból álló sokszög (bal felső, bal alsó, jobb alsó, jobb felső):

Point2d tl = új Point2dImpl (10, 10); Point2d bl = új Point2dImpl (10, image.getHeight () - 10); Point2d br = új Point2dImpl (image.getWidth () - 10, image.getHeight () - 10); Point2d tr = új Point2dImpl (image.getWidth () - 10, 10); Sokszög sokszög = új sokszög (tömbök. AsList (tl, bl, br, tr));

Mint észrevehette, a képfeldolgozás során az Y-tengely megfordul. Az alak meghatározása után meg kell rajzolnunk:

image.drawPolygon (sokszög, 4, új Float [] {0f, 0f, 255.0f});

A rajzoláshoz 3 argumentumra van szükség: alak, vonalvastagság és RGB csatornaértékek Úszó sor.

4.3. Kép megjelenítése

Használnunk kell DisplayUtilities:

DisplayUtilities.display (kép);

5. Tizenkét majomImageIO

A Tizenkét majomImageIO könyvtár célja a Java kiterjesztése ImageIO API, több formátum támogatásával.

Legtöbbször a kód ugyanúgy fog kinézni, mint a beépített Java-kód, de további képformátumokkal fog működni, a szükséges függőségek hozzáadása után.

Alapértelmezés szerint a Java csak az alábbi öt formátumot támogatja a képeknél: JPEG, PNG, BMP, WEBMP, GIF.

Ha megpróbálunk más formátumú képfájlokkal dolgozni, alkalmazásunk nem lesz képes elolvasni, és a-t dob NullPointerException amikor a BufferedImage változó.

Tizenkét majom támogatja a következő formátumokat: PNM, PSD, TIFF, HDR, IFF, PCX, PICT, SGI, TGA, ICNS, ICO, KORCS, Remek.db, SVG, WMF.

Ahhoz, hogy egy meghatározott formátumú képekkel dolgozzunk, hozzá kell adnunk a megfelelő függőséget, például imageio-jpeg vagy imageio-tiff.

A függőségek teljes listáját a TwelveMonkeys dokumentációjában találja meg.

Készítsünk egy példát, amely a .ico kép. A kód ugyanúgy fog kinézni, mint a AWT szakasz, kivéve, ha egy másik képet nyitunk meg:

Karakterlánc imagePath = "elérési út / a / a / képedhez .ico"; BufferedImage myPicture = ImageIO.read (új fájl (imagePath));

Ahhoz, hogy ez a példa működjön, hozzá kell adnunk a Tizenkét majom függőség, amely támogatást tartalmaz a .ico images, amely az imageio-bmp és az imageio-core függőség:

 com.twelvemonkeys.imageio imageio-bmp 3.3.2 com.twelvemonkeys.imageio imageio-core 3.3.2 

És ez minden! A beépített ImageIO A Java API futás közben automatikusan betölti a bővítményeket. Most a projektünk együtt fog működni .ico képek is.

6. Összefoglalás

4 könyvtárat ismertettek meg, amelyek segíthetnek a képek kezelésében. Továbblépve érdemes keresni néhány képfeldolgozó algoritmust, például az élek kibontását, a kontraszt növelését, a szűrők vagy az arcfelismerés használatát.

Ebből a célból jobb lehet elkezdeni az ImageJ vagy az OpenIMAJ tanulását. Mindkettő könnyen belefoglalható egy projektbe, és sokkal erősebb, mint az AWT a képfeldolgozás szempontjából.

Ezek a képfeldolgozási példák a GitHub projektben találhatók.