Szöveg hozzáadása képhez Java-ban

1. Áttekintés

Néha szöveget kell hozzáadnunk egy képhez vagy egy képsorhoz. Ennek manuális elvégzése egyszerű a képszerkesztő eszköz használatával. De amikor ugyanazt a szöveget ugyanúgy szeretnénk hozzáadni a jelentős számú képhez, akkor nagyon hasznos lenne ezt programozottan megtenni.

Ebben a gyors bemutatóban megtanuljuk hogyan adjunk hozzá néhány szöveget a képekhez Java használatával.

2. Szöveg hozzáadása egy képhez

Kép elolvasásához és szöveg hozzáadásához különböző osztályokat használhatunk. A következő szakaszokban megnézünk pár lehetőséget.

2.1. ImagePlus és ImageProcessor

Először nézzük meg az osztályok használata ImagePlus és ImageProcessor amelyek az ImageJ könyvtárban érhetők el. A könyvtár használatához be kell építenünk ezt a függőséget a projektünkbe:

 net.imagej ij 1,51h 

A kép elolvasásához a openImage statikus módszer. Ennek a módszernek az eredményét a memóriában tároljuk ImagePlus tárgy:

ImagePlus image = IJ.openImage (elérési út);

Miután betöltöttük a képet a memóriába, adjunk hozzá néhány szöveget az osztály segítségével ImageProcessor:

Font font = new Font ("Arial", Font.BOLD, 18); ImageProcessor ip = image.getProcessor (); ip.setColor (Color.GREEN); ip.setFont (font); ip.drawString (szöveg, 0, 20);

Ezzel a kóddal azt csináljuk, hogy hozzáadjuk a megadott zöld színű szöveget a kép bal felső sarkába. Ne feledje, hogy a pozíciót a és a második és harmadik argumentum segítségével állítjuk be drawString módszer, amelyek a pixelek számát képviselik balról, illetve felülről.

2.2. BufferedImage és Grafika

Ezután meglátjuk hogyan érhetjük el ugyanazt az eredményt az osztályok használatával BufferedImage és Grafika. A Java standard felépítése tartalmazza ezeket az osztályokat, így nincs szükség további könyvtárakra.

Ugyanúgy, ahogyan mi használtuk openImage nak,-nek ImageJ, használni fogjuk a olvas ban elérhető módszer ImageIO:

BufferedImage image = ImageIO.read (új fájl (elérési út));

Miután betöltötte a képet a memóriába, adjunk hozzá néhány szöveget az osztály használatával Grafika:

Font font = new Font ("Arial", Font.BOLD, 18); Grafika g = image.getGraphics (); g.setFont (font); g.setColor (Color.GREEN); g.drawString (szöveg, 0, 20);

Mint láthatjuk, mindkét alternatíva nagyon hasonló a használatuk módjában. Ebben az esetben a módszer második és harmadik érve drawString ugyanúgy vannak megadva, mint amit a ImageProcessor módszer.

2.3. Rajzolás alapján AttributedCharacterIterator

A módszer, a metódus drawString elérhető Grafika lehetővé teszi számunkra nyomtassa ki a szöveget egy AttributedCharacterIterator. Ez azt jelenti, hogy a sima használata helyett Húr, használhatunk szöveget néhány tulajdonsággal társítva. Lássunk egy példát:

Font font = new Font ("Arial", Font.BOLD, 18); AttributedString attributedText = új AttributedString (szöveg); attributedText.addAttribute (TextAttribute.FONT, font); attributedText.addAttribute (TextAttribute.FOREGROUND, Color.GREEN); Grafika g = image.getGraphics (); g.drawString (attributedText.getIterator (), 0, 20);

A szöveg nyomtatásának ez a módja lehetőséget ad arra, hogy a formátumot közvetlenül a Húr, ami tisztább, mint a változtatás Grafika az objektum tulajdonságai, amikor a formátumot meg akarjuk változtatni.

3. Szöveg igazítása

Most, hogy megtanultuk, hogyan kell egy egyszerű szöveget hozzáadni a kép bal felső sarkához, nézzük meg, hogyan adhatjuk ezt hozzá szöveg bizonyos pozíciókban.

3.1. Középre helyezett szöveg

Az első típusú igazítás, amelyet meg fogunk oldani, az központosítva a szöveget. Ahhoz, hogy dinamikusan állítsuk be a megfelelő helyet, ahová a szöveget akarjuk írni, ki kell találnunk néhány információt:

  • Képméret
  • Betűméret

Ez az információ nagyon könnyen megszerezhető. Képméret esetén ezek az adatok a módszerekkel érhetők el getWidth és getHeight a BufferedImage tárgy. Másrészt a betűmérettel kapcsolatos adatok megszerzéséhez az objektumot kell használnunk FontMetrics.

Lássunk egy példát, ahol kiszámoljuk és megrajzoljuk a szövegünk helyes pozícióját:

Grafika g = image.getGraphics (); FontMetrics metrics = g.getFontMetrics (font); int positionX = (image.getWidth () - metrics.stringWidth (text)) / 2; int helyzetY = (image.getHeight () - metrics.getHeight ()) / 2 + metrics.getAscent (); g.drawString (attributedText.getIterator (), positionX, positionY);

3.2. Szöveg igazítva a jobb alsó sarokban

A következő igazítási típus, amelyet látni fogunk, a jobb alsó rész. Ebben az esetben dinamikusan meg kell kapnunk a helyes pozíciókat:

int positionX = (image.getWidth () - metrics.stringWidth (szöveg)); int helyzetY = (image.getHeight () - metrics.getHeight ()) + metrics.getAscent ();

3.3. A bal felső sarokban található szöveg

Végül nézzük meg hogyan nyomtassuk ki a szövegünket a bal felső sarokban:

int helyzet X = 0; int helyzetY = metrika.getAscent ();

A többi igazítás levezethető a három közül, amit láttunk.

4. A szövegméret beállítása kép alapján

Amikor a képre rajzoljuk a szöveget, azt tapasztalhatjuk, hogy ez a szöveg meghaladja a kép méretét. Ennek megoldásához muszáj állítsa be a betűméretet amelyet a képméret alapján használunk.

Először meg kell szereznünk a szöveg várható szélességét és magasságát az alap betűtípussal. Ennek elérése érdekében felhasználjuk az osztályokat FontMetrics, GlyphVector, és Alak.

FontMetrics vonalzó = graphics.getFontMetrics (baseFont); GlyphVector vektor = baseFont.createGlyphVector (vonalzó.getFontRenderContext (), szöveg); Alakzatvázlat = vector.getOutline (0, 0); dupla várható Szélesség = vázlat.getBounds (). getWidth (); duplája várhatóHeight = vázlat.getBounds (). getHeight (); 

A következő lépés annak ellenőrzése, hogy szükséges-e a betű átméretezése. Ehhez hasonlítsuk össze a szöveg várható méretét és a kép méretét:

logikai szövegFits = image.getWidth ()> = várhatóWidth && image.getHeight ()> = várhatóHeight;

Végül, ha a szövegünk nem fér bele a képbe, csökkentenünk kell a betűméretet. Használjuk a módszert deriveFont azért:

dupla widthBasedFontSize = (baseFont.getSize2D () * image.getWidth ()) / várhatóWidth; dupla magasságBasedFontSize = (baseFont.getSize2D () * image.getHeight ()) / várhatóHeight; double newFontSize = widthBasedFontSize <heightBasedFontSize? widthBasedFontSize: heightBasedFontSize; newFont = baseFont.deriveFont (baseFont.getStyle (), (float) newFontSize);

Vegye figyelembe, hogy meg kell szereznünk az új betűméretet mind a szélesség, mind a magasság alapján, és a legalacsonyabbat kell alkalmaznunk.

5. Összefoglalás

Ebben a cikkben azt láttuk, hogyan lehet szöveget írni egy képbe különböző módszerekkel.

Megtanultuk azt is, hogyan lehet dinamikusan elérni azt a helyzetet, ahová a képméret és a betűtípus tulajdonságai alapján ki akarjuk nyomtatni a szövegünket.

Végül láttuk, hogyan lehet a szöveg betűméretét adaptálni arra az esetre, ha az meghaladja a kép méretét, ahová rajzoljuk.

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.