Tilføjelse af tekst til et billede i Java

1. Oversigt

Nogle gange er vi nødt til at tilføje noget tekst til et billede eller et sæt billeder. Det er nemt at gøre dette manuelt ved hjælp af et billedredigeringsværktøj. Men når vi vil tilføje den samme tekst på samme måde til et betydeligt antal billeder, ville det være meget nyttigt at gøre dette programmatisk.

I denne hurtige vejledning lærer vi hvordan du tilføjer tekst til billeder ved hjælp af Java.

2. Tilføjelse af tekst til et billede

For at læse et billede og tilføje lidt tekst kan vi bruge forskellige klasser. I de efterfølgende afsnit vil vi se et par muligheder.

2.1. ImagePlus og ImageProcessor

Lad os først se hvordan man bruger klasser ImagePlus og ImageProcessor der er tilgængelige i ImageJ-biblioteket. For at bruge dette bibliotek skal vi medtage denne afhængighed i vores projekt:

 net.imagej ij 1.51h 

For at læse billedet bruger vi openImage statisk metode. Resultatet af denne metode gemmes i hukommelsen ved hjælp af en ImagePlus objekt:

ImagePlus-billede = IJ.openImage (sti);

Når vi først har indlæst billedet i hukommelsen, lad os tilføje lidt tekst til det ved hjælp af klassen ImageProcessor:

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

Med denne kode tilføjer vi den angivne tekst i grønt øverst til venstre på billedet, hvad vi laver. Bemærk, at vi indstiller positionen ved hjælp af det andet og tredje argument for drawString metode, der repræsenterer antallet af pixels fra henholdsvis venstre og top.

2.2. BufferedImage og Grafik

Dernæst skal vi se hvordan vi kan opnå det samme resultat ved hjælp af klasserne BufferedImage og Grafik. Standard build af Java inkluderer disse klasser, så der er ikke behov for yderligere biblioteker.

På samme måde som vi brugte openImage af ImageJ, vi skal bruge Læs metode tilgængelig i ImageIO:

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

Når vi har billedet indlæst i hukommelsen, lad os tilføje lidt tekst til det ved hjælp af klassen Grafik:

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

Som vi kan se, er begge alternativer meget ens i den måde, de bruges på. I dette tilfælde er metodens andet og tredje argument drawString er specificeret på samme måde som vi har gjort for ImageProcessor metode.

2.3. Draw baseret på AttributCharacterIterator

Metoden drawString tilgængelig i Grafik tillader os at udskrive teksten ved hjælp af en AttributCharacterIterator. Dette betyder, at i stedet for at bruge en almindelig Snor, kunne vi bruge tekst med nogle tilknyttede egenskaber. Lad os se et eksempel:

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

Denne måde at udskrive teksten på giver os chancen for at knytte formatet direkte til Snor, som er renere end at ændre Grafik objektegenskaber, når vi vil ændre formatet.

3. Tekstjustering

Nu hvor vi har lært at tilføje en simpel tekst øverst til venstre på et billede, lad os nu se, hvordan vi kan tilføje dette tekst i visse positioner.

3.1. Centreret tekst

Den første type tilpasning, som vi skal tackle, er centrering af teksten. For dynamisk at indstille den korrekte position, hvor vi vil skrive teksten, skal vi finde ud af nogle oplysninger:

  • Billedestørrelse
  • Skriftstørrelse

Disse oplysninger kan opnås meget let. I tilfælde af billedstørrelse kan disse data tilgås via metoderne getWidth og getHeight af BufferedImage objekt. På den anden side er det nødvendigt at bruge objektet for at få de data, der er relateret til skriftstørrelsen FontMetrics.

Lad os se et eksempel, hvor vi beregner den korrekte position for vores tekst og tegner den:

Grafik g = image.getGraphics (); FontMetrics metrics = g.getFontMetrics (font); int positionX = (image.getWidth () - metrics.stringWidth (tekst)) / 2; int positionY = (image.getHeight () - metrics.getHeight ()) / 2 + metrics.getAscent (); g.drawString (attributText.getIterator (), positionX, positionY);

3.2. Tekst justeret nederst til højre

Den næste type tilpasning, som vi skal se, er nederst til højre. I dette tilfælde skal vi dynamisk få de rigtige positioner:

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

3.3. Tekst placeret øverst til venstre

Lad os endelig se hvordan man udskriver vores tekst øverst til venstre:

int positionX = 0; int positionY = metrics.getAscent ();

Resten af ​​opstillingerne kan udledes af de tre, vi har set.

4. Tilpasning af tekststørrelse baseret på billede

Når vi tegner teksten i billedet, finder vi muligvis ud af, at denne tekst overstiger billedets størrelse. For at løse dette skal vi tilpasse størrelsen på skrifttypen som vi bruger baseret på billedstørrelsen.

Først skal vi opnå den forventede bredde og højde på teksten ved hjælp af basiskrifttypen. For at opnå dette bruger vi klasserne FontMetrics, GlyphVector, og Form.

FontMetrics lineal = graphics.getFontMetrics (baseFont); GlyphVector-vektor = baseFont.createGlyphVector (lineal.getFontRenderContext (), tekst); Form kontur = vector.getOutline (0, 0); dobbelt forventet bredde = outline.getBounds (). getWidth (); dobbelt forventet højde = outline.getBounds (). getHeight (); 

Det næste trin er at kontrollere, om skrifttypens størrelse er nødvendig. Lad os til dette formål sammenligne den forventede størrelse på teksten og størrelsen på billedet:

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

Endelig, hvis vores tekst ikke passer ind i billedet, er vi nødt til at reducere skriftstørrelsen. Vi bruger metoden afledeFont for det:

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

Bemærk, at vi skal hente den nye skriftstørrelse baseret på både bredde og højde og anvende den laveste af dem.

5. Resume

I denne artikel har vi set, hvordan man skriver tekst i et billede ved hjælp af forskellige metoder.

Vi har også lært, hvordan man dynamisk får den position, hvor vi vil udskrive vores tekst baseret på billedstørrelse og skrifttypeegenskaber.

Endelig har vi set, hvordan man tilpasser tekststørrelsen på teksten, hvis den overstiger størrelsen på billedet, hvor vi tegner det.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.


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