Legge til tekst til et bilde i Java

1. Oversikt

Noen ganger må vi legge til litt tekst i et bilde eller et sett med bilder. Å gjøre dette manuelt er enkelt ved å bruke et bilderedigeringsverktøy. Men når vi vil legge til den samme teksten på samme måte til et betydelig antall bilder, ville det være veldig nyttig å gjøre dette programmatisk.

I denne raske opplæringen skal vi lære hvordan du legger til litt tekst i bilder bruker Java.

2. Legge til tekst i et bilde

For å lese et bilde og legge til litt tekst, kan vi bruke forskjellige klasser. I de påfølgende delene skal vi se et par alternativer.

2.1. ImagePlus og ImageProcessor

La oss først se hvordan du bruker klassene ImagePlus og ImageProcessor som er tilgjengelige i ImageJ-biblioteket. For å bruke dette biblioteket må vi inkludere denne avhengigheten i prosjektet vårt:

 net.imagej ij 1.51h 

For å lese bildet bruker vi openImage statisk metode. Resultatet av denne metoden lagres i minnet ved hjelp av en ImagePlus gjenstand:

ImagePlus image = IJ.openImage (sti);

Når vi har lagt inn bildet i minnet, la oss legge til litt tekst i det ved hjelp av klassen ImageProcessor:

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

Med denne koden legger vi til den spesifiserte teksten i grønt øverst til venstre på bildet. Merk at vi setter posisjonen ved hjelp av det andre og tredje argumentet til drawString metode som representerer antall piksler fra henholdsvis venstre og topp.

2.2. BufferedImage og Grafikk

Deretter skal vi se hvordan vi kan oppnå det samme resultatet ved bruk av klassene BufferedImage og Grafikk. Standardutgaven av Java inkluderer disse klassene, så det er ikke behov for flere biblioteker.

På samme måte som vi brukte openImage av ImageJ, vi skal bruke lese metoden tilgjengelig i ImageIO:

BufferedImage image = ImageIO.read (ny fil (bane));

Når vi har lastet bildet i minnet, la oss legge til litt tekst i det ved hjelp av klassen Grafikk:

Font font = new Font ("Arial", Font.BOLD, 18); Grafikk g = image.getGraphics (); g.setFont (font); g.setColor (Color.GREEN); g.drawString (tekst, 0, 20);

Som vi kan se, er begge alternativene veldig like i måten de brukes på. I dette tilfellet er det andre og det tredje argumentet for metoden drawString er spesifisert på samme måte som vi har gjort for ImageProcessor metode.

2.3. Tegn basert på AttributCharacterIterator

Metoden drawString tilgjengelig i Grafikk tillater oss å skriv ut teksten ved hjelp av en AttributCharacterIterator. Dette betyr at i stedet for å bruke en vanlig String, kan vi bruke tekst med noen tilknyttede egenskaper. La oss se et eksempel:

Font font = new Font ("Arial", Font.BOLD, 18); AttributString attributText = ny AttributString (tekst); attributText.addAttribute (TextAttribute.FONT, font); attributeText.addAttribute (TextAttribute.FOREGROUND, Color.GREEN); Grafikk g = image.getGraphics (); g.drawString (attribuertText.getIterator (), 0, 20);

Denne måten å skrive ut teksten på, gir oss sjansen til å knytte formatet direkte til String, som er renere enn å endre Grafikk objektegenskaper når vi vil endre formatet.

3. Tekstjustering

Nå som vi har lært hvordan vi legger til en enkel tekst øverst til venstre i et bilde, la oss nå se hvordan vi kan legge til dette tekst i visse posisjoner.

3.1. Sentrert tekst

Den første typen justering vi skal takle er sentrering av teksten. For å dynamisk sette riktig posisjon der vi vil skrive teksten, må vi finne ut litt informasjon:

  • Bildestørrelse
  • Skriftstørrelse

Denne informasjonen kan fås veldig enkelt. Når det gjelder bildestørrelsen, kan du få tilgang til disse dataene via metodene getWidth og getHeight av BufferedImage gjenstand. På den annen side, for å få data relatert til skriftstørrelsen, trenger vi å bruke objektet FontMetrics.

La oss se et eksempel der vi beregner riktig posisjon for teksten vår og tegner den:

Grafikk g = image.getGraphics (); FontMetrics metrics = g.getFontMetrics (font); int positionX = (image.getWidth () - metrics.stringWidth (text)) / 2; int posisjon Y = (image.getHeight () - metrics.getHeight ()) / 2 + metrics.getAscent (); g.drawString (attribuertText.getIterator (), posisjonX, posisjonY);

3.2. Tekst justert nederst til høyre

Den neste typen justering som vi skal se er nederst til høyre. I dette tilfellet må vi dynamisk få de riktige posisjonene:

int positionX = (image.getWidth () - metrics.stringWidth (tekst)); int posisjonY = (image.getHeight () - metrics.getHeight ()) + metrics.getAscent ();

3.3. Tekst øverst til venstre

Til slutt, la oss se hvordan du skriver ut teksten vår øverst til venstre:

int posisjonX = 0; int posisjon Y = metrics.getAscent ();

Resten av linjene kan trekkes fra de tre vi har sett.

4. Tilpasse tekststørrelse basert på bilde

Når vi tegner teksten i bildet, kan vi oppdage at denne teksten overstiger størrelsen på bildet. For å løse dette må vi tilpasse størrelsen på fonten som vi bruker basert på bildestørrelsen.

Først må vi oppnå den forventede bredden og høyden på teksten ved hjelp av grunnfonten. For å oppnå dette bruker vi klassene FontMetrics, GlyphVector, og Form.

FontMetrics linjal = graphics.getFontMetrics (baseFont); GlyphVector vector = baseFont.createGlyphVector (ruler.getFontRenderContext (), text); Form disposisjon = vector.getOutline (0, 0); dobbelt forventet bredde = outline.getBounds (). getWidth (); dobbelt forventet høyde = outline.getBounds (). getHeight (); 

Det neste trinnet er å sjekke om endring av skriftstørrelse er nødvendig. For dette formålet, la oss sammenligne den forventede størrelsen på teksten og størrelsen på bildet:

boolsk textFits = image.getWidth ()> = forventet bredde && image.getHeight ()> = forventet høyde;

Til slutt, hvis teksten vår ikke passer inn i bildet, må vi redusere skriftstørrelsen. Vi bruker metoden deriveFont for det:

dobbel widthBasedFontSize = (baseFont.getSize2D () * image.getWidth ()) / forventet bredde; dobbel høydeBasertFontSize = (baseFont.getSize2D () * image.getHeight ()) / forventetHøyde; dobbel newFontSize = widthBasedFontSize <høydeBasertFontSize? widthBasedFontSize: heightBasedFontSize; newFont = baseFont.deriveFont (baseFont.getStyle (), (float) newFontSize);

Merk at vi må skaffe oss den nye skriftstørrelsen basert på både bredde og høyde og bruke den laveste av dem.

5. Sammendrag

I denne artikkelen har vi sett hvordan du skriver tekst i et bilde ved hjelp av forskjellige metoder.

Vi har også lært hvordan vi dynamisk får posisjonen der vi ønsker å skrive ut teksten vår basert på bildestørrelse og skriftegenskaper.

Til slutt har vi sett hvordan vi kan tilpasse skriftstørrelsen til teksten i tilfelle den overstiger størrelsen på bildet der vi tegner den.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


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