Pridanie textu k obrázku v jazyku Java

1. Prehľad

Niekedy potrebujeme k obrázku alebo množine obrázkov pridať nejaký text. To je možné manuálne pomocou nástroja na úpravu obrázkov. Ale ak chceme pridať rovnaký text rovnakým spôsobom k významnému počtu obrázkov, bolo by veľmi užitočné urobiť to programovo.

V tomto rýchlom výučbe sa naučíme ako pridať nejaký text k obrázkom pomocou Javy.

2. Pridanie textu k obrázku

Na prečítanie obrázka a doplnenie textu môžeme použiť rôzne triedy. V nasledujúcich častiach uvidíme niekoľko možností.

2.1. ImagePlus a ImageProcessor

Najprv sa pozrime ako používať triedy ImagePlus a ImageProcessor ktoré sú k dispozícii v knižnici ImageJ. Aby sme mohli používať túto knižnicu, musíme do nášho projektu zahrnúť túto závislosť:

 net.imagej ij 1,51h 

Na prečítanie obrázka použijeme openImage statická metóda. Výsledok tejto metódy sa uloží do pamäte pomocou znaku ImagePlus objekt:

ImagePlus image = IJ.openImage (cesta);

Keď už máme obrázok načítaný do pamäte, pridajme k nemu pomocou triedy nejaký text ImageProcessor:

Písmo písma = nové Písmo ("Arial", Font.BOLD, 18); ImageProcessor ip = image.getProcessor (); ip.setColor (Color.GREEN); ip.setFont (písmo); ip.drawString (text, 0, 20);

Týmto kódom je to, že pridávame zadaný text zelenou farbou do ľavej hornej časti obrázka. Upozorňujeme, že polohu sme nastavili pomocou druhého a tretieho argumentu parametra drawString metóda, ktorá predstavuje počet pixelov zľava a zhora.

2.2. BufferedImage a Grafika

Ďalej sa pozrieme ako môžeme pomocou tried dosiahnuť rovnaký výsledok BufferedImage a Grafika. Štandardné zostavenie Java obsahuje tieto triedy, takže nie sú potrebné ďalšie knižnice.

Rovnakým spôsobom, aký sme použili aj my openImage z Obrázok J., použijeme čítať metóda dostupná v ImageIO:

BufferedImage image = ImageIO.read (nový súbor (cesta));

Keď už máme obrázok načítaný v pamäti, pridajme k nemu pomocou triedy nejaký text Grafika:

Písmo písma = nové Písmo ("Arial", Font.BOLD, 18); Grafika g = image.getGraphics (); g.setFont (písmo); g.setColor (Color.GREEN); g.drawString (text, 0, 20);

Ako vidíme, obe alternatívy sú si veľmi podobné v spôsobe použitia. V tomto prípade druhý a tretí argument metódy drawString sú špecifikované rovnakým spôsobom, aký sme vykonali pre ImageProcessor metóda.

2.3. Nakreslite na základe AttributedCharacterIterator

Metóda drawString dostupné v Grafika umožňuje nám to vytlačte text pomocou AttributedCharacterIterator. To znamená, že namiesto roviny String, mohli by sme použiť text s niektorými súvisiacimi vlastnosťami. Pozrime sa na príklad:

Písmo písma = nové Písmo ("Arial", Font.BOLD, 18); AttributedString attributedText = nový AttributedString (text); attributedText.addAttribute (TextAttribute.FONT, písmo); attributedText.addAttribute (TextAttribute.FOREGROUND, Color.GREEN); Grafika g = image.getGraphics (); g.drawString (attributedText.getIterator (), 0, 20);

Tento spôsob tlače textu nám dáva možnosť spojiť formát priamo s String, ktorá je čistejšia ako zmena Grafika vlastnosti objektu, kedykoľvek chceme zmeniť formát.

3. Zarovnanie textu

Teraz, keď sme sa naučili, ako pridať jednoduchý text do ľavého horného rohu obrázka, pozrime sa teraz, ako ho môžeme pridať text na určitých pozíciách.

3.1. Zarovnaný text

Prvý typ zosúladenia, s ktorým sa budeme vyrovnávať, je vycentrovanie textu. Aby sme dynamicky nastavili správnu pozíciu na miesto, kde chceme text napísať, musíme zistiť niekoľko informácií:

  • Veľkosť obrázku
  • Veľkosť písma

Tieto informácie je možné získať veľmi ľahko. V prípade veľkosti obrázka je možné k týmto údajom získať prístup prostredníctvom metód getWidth a získať výšku z BufferedImage objekt. Na druhej strane, aby sme získali údaje týkajúce sa veľkosti písma, musíme objekt použiť FontMetrics.

Pozrime sa na príklad, kde vypočítame správnu pozíciu pre náš text a nakreslíme ho:

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

3.2. Text zarovnaný vpravo dole

Ďalší typ zarovnania, ktorý uvidíme, je vpravo dole. V takom prípade musíme dynamicky získať správne polohy:

int positionX = (image.getWidth () - metrics.stringWidth (text)); int positionY = (image.getHeight () - metrics.getHeight ()) + metrics.getAscent ();

3.3. Text umiestnený v ľavom hornom rohu

Nakoniec sa pozrime ako tlačiť náš text v ľavom hornom rohu:

int poloha X = 0; int positionY = metrics.getAscent ();

Zvyšok zarovnaní možno odvodiť z troch, ktoré sme videli.

4. Prispôsobenie veľkosti textu na základe obrázka

Keď nakreslíme text do obrázka, mohli by sme zistiť, že tento text presahuje veľkosť obrázka. Aby sme to vyriešili, musíme prispôsobiť veľkosť písma ktoré používame na základe veľkosti obrázka.

Najskôr musíme pomocou základného písma získať predpokladanú šírku a výšku textu. Aby sme to dosiahli, využijeme triedy FontMetrics, GlyphVector, a Tvar.

Pravítko FontMetrics = graphics.getFontMetrics (baseFont); GlyphVector vector = baseFont.createGlyphVector (ruler.getFontRenderContext (), text); Obrys tvaru = vector.getOutline (0, 0); dvojnásobná očakávaná šírka = outline.getBounds (). getWidth (); dvojitá očakávaná výška = outline.getBounds (). getHeight (); 

Ďalším krokom je kontrola, či je potrebná zmena veľkosti písma. Z tohto dôvodu porovnáme predpokladanú veľkosť textu a veľkosť obrázka:

boolean textFits = image.getWidth ()> = expectWidth && image.getHeight ()> = expectHeight;

Nakoniec, ak sa náš text nezmestí do obrázka, musíme zmenšiť veľkosť písma. Použijeme metódu deriveFont pre to:

double widthBasedFontSize = (baseFont.getSize2D () * image.getWidth ()) / expectWidth; dvojitá výškaBasedFontSize = (baseFont.getSize2D () * image.getHeight ()) / expectHeight; double newFontSize = widthBasedFontSize <heightBasedFontSize? widthBasedFontSize: heightBasedFontSize; newFont = baseFont.deriveFont (baseFont.getStyle (), (float) newFontSize);

Upozorňujeme, že musíme získať novú veľkosť písma na základe šírky aj výšky a použiť najmenšiu z nich.

5. Zhrnutie

V tomto článku sme videli, ako písať text do obrázka pomocou rôznych metód.

Naučili sme sa tiež, ako dynamicky získať pozíciu, kde chceme tlačiť náš text, na základe veľkosti obrázka a vlastností písma.

Nakoniec sme videli, ako prispôsobiť veľkosť písma textu, ak presahuje veľkosť obrázka, na ktorý ho kreslíme.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found