[BAEL-4240] Adding Text to an Image in Java (#9642)
* [BAEL-4240] Code Upload * [BAEL-4240] Remove double space * [BAEL-4240] Adapting Text to the image * [BAEL-4240] Package rename
This commit is contained in:
parent
44c664a34d
commit
bf1e2c09f7
|
@ -0,0 +1,220 @@
|
||||||
|
package com.baeldung.imageprocessing.addingtext;
|
||||||
|
|
||||||
|
import ij.IJ;
|
||||||
|
import ij.ImagePlus;
|
||||||
|
import ij.process.ImageProcessor;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.font.GlyphVector;
|
||||||
|
import java.awt.font.TextAttribute;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.AttributedString;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
public class AddText {
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
String imagePath = AddText.class.getClassLoader().getResource("lena.jpg").getPath();
|
||||||
|
|
||||||
|
ImagePlus resultPlus= signImageImageProcessor("www.baeldung.com", imagePath);
|
||||||
|
resultPlus.show();
|
||||||
|
|
||||||
|
ImagePlus resultGraphics = new ImagePlus("", signImageGraphics("www.baeldung.com", imagePath));
|
||||||
|
resultGraphics.show();
|
||||||
|
|
||||||
|
ImagePlus resultGraphicsWithIterator = new ImagePlus("", signImageGraphicsWithIterator("www.baeldung.com", imagePath));
|
||||||
|
resultGraphicsWithIterator.show();
|
||||||
|
|
||||||
|
ImagePlus resultGraphicsCentered = new ImagePlus("", signImageCenter("www.baeldung.com", imagePath));
|
||||||
|
resultGraphicsCentered.show();
|
||||||
|
|
||||||
|
ImagePlus resultGraphicsBottomRight = new ImagePlus("", signImageBottomRight("www.baeldung.com", imagePath));
|
||||||
|
resultGraphicsBottomRight.show();
|
||||||
|
|
||||||
|
ImagePlus resultGraphicsTopLeft= new ImagePlus("", signImageTopLeft("www.baeldung.com", imagePath));
|
||||||
|
resultGraphicsTopLeft.show();
|
||||||
|
|
||||||
|
ImagePlus resultGraphicsAdaptBasedOnImage= new ImagePlus("", signImageAdaptBasedOnImage("www.baeldung.com", imagePath));
|
||||||
|
resultGraphicsAdaptBasedOnImage.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ImagePlus signImageImageProcessor(String text, String path) {
|
||||||
|
ImagePlus image = IJ.openImage(path);
|
||||||
|
Font font = new Font("Arial", Font.BOLD, 18);
|
||||||
|
|
||||||
|
ImageProcessor ip = image.getProcessor();
|
||||||
|
ip.setColor(Color.GREEN);
|
||||||
|
ip.setFont(font);
|
||||||
|
ip.drawString(text, 0, 20);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BufferedImage signImageGraphics(String text, String path) throws IOException {
|
||||||
|
BufferedImage image = ImageIO.read(new File(path));
|
||||||
|
Font font = new Font("Arial", Font.BOLD, 18);
|
||||||
|
|
||||||
|
Graphics g = image.getGraphics();
|
||||||
|
g.setFont(font);
|
||||||
|
g.setColor(Color.GREEN);
|
||||||
|
g.drawString(text, 0, 20);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static BufferedImage signImageGraphicsWithIterator(String text, String path) throws IOException {
|
||||||
|
BufferedImage image = ImageIO.read(new File(path));
|
||||||
|
Font font = new Font("Arial", Font.BOLD, 18);
|
||||||
|
|
||||||
|
AttributedString attributedText = new AttributedString(text);
|
||||||
|
attributedText.addAttribute(TextAttribute.FONT, font);
|
||||||
|
attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN);
|
||||||
|
|
||||||
|
Graphics g = image.getGraphics();
|
||||||
|
g.drawString(attributedText.getIterator(), 0, 20);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a String centered in the middle of a Rectangle.
|
||||||
|
*
|
||||||
|
* @param g The Graphics instance.
|
||||||
|
* @param text The String to draw.
|
||||||
|
* @param rect The Rectangle to center the text in.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static BufferedImage signImageCenter(String text, String path) throws IOException {
|
||||||
|
|
||||||
|
BufferedImage image = ImageIO.read(new File(path));
|
||||||
|
Font font = new Font("Arial", Font.BOLD, 18);
|
||||||
|
|
||||||
|
AttributedString attributedText = new AttributedString(text);
|
||||||
|
attributedText.addAttribute(TextAttribute.FONT, font);
|
||||||
|
attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN);
|
||||||
|
|
||||||
|
Graphics g = image.getGraphics();
|
||||||
|
|
||||||
|
FontMetrics metrics = g.getFontMetrics(font);
|
||||||
|
int positionX = (image.getWidth() - metrics.stringWidth(text)) / 2;
|
||||||
|
int positionY = (image.getHeight() - metrics.getHeight()) / 2 + metrics.getAscent();
|
||||||
|
|
||||||
|
g.drawString(attributedText.getIterator(), positionX, positionY);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a String centered in the middle of a Rectangle.
|
||||||
|
*
|
||||||
|
* @param g The Graphics instance.
|
||||||
|
* @param text The String to draw.
|
||||||
|
* @param rect The Rectangle to center the text in.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static BufferedImage signImageBottomRight(String text, String path) throws IOException {
|
||||||
|
|
||||||
|
BufferedImage image = ImageIO.read(new File(path));
|
||||||
|
|
||||||
|
Font font = new Font("Arial", Font.BOLD, 18);
|
||||||
|
|
||||||
|
AttributedString attributedText = new AttributedString(text);
|
||||||
|
attributedText.addAttribute(TextAttribute.FONT, font);
|
||||||
|
attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN);
|
||||||
|
|
||||||
|
Graphics g = image.getGraphics();
|
||||||
|
|
||||||
|
FontMetrics metrics = g.getFontMetrics(font);
|
||||||
|
int positionX = (image.getWidth() - metrics.stringWidth(text));
|
||||||
|
int positionY = (image.getHeight() - metrics.getHeight()) + metrics.getAscent();
|
||||||
|
|
||||||
|
g.drawString(attributedText.getIterator(), positionX, positionY);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a String centered in the middle of a Rectangle.
|
||||||
|
*
|
||||||
|
* @param g The Graphics instance.
|
||||||
|
* @param text The String to draw.
|
||||||
|
* @param rect The Rectangle to center the text in.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static BufferedImage signImageTopLeft(String text, String path) throws IOException {
|
||||||
|
|
||||||
|
BufferedImage image = ImageIO.read(new File(path));
|
||||||
|
|
||||||
|
Font font = new Font("Arial", Font.BOLD, 18);
|
||||||
|
|
||||||
|
AttributedString attributedText = new AttributedString(text);
|
||||||
|
attributedText.addAttribute(TextAttribute.FONT, font);
|
||||||
|
attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN);
|
||||||
|
|
||||||
|
Graphics g = image.getGraphics();
|
||||||
|
|
||||||
|
FontMetrics metrics = g.getFontMetrics(font);
|
||||||
|
int positionX = 0;
|
||||||
|
int positionY = metrics.getAscent();
|
||||||
|
|
||||||
|
g.drawString(attributedText.getIterator(), positionX, positionY);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a String centered in the middle of a Rectangle.
|
||||||
|
*
|
||||||
|
* @param g The Graphics instance.
|
||||||
|
* @param text The String to draw.
|
||||||
|
* @param rect The Rectangle to center the text in.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static BufferedImage signImageAdaptBasedOnImage(String text, String path) throws IOException {
|
||||||
|
|
||||||
|
BufferedImage image = ImageIO.read(new File(path));
|
||||||
|
|
||||||
|
Font font = createFontToFit(new Font("Arial", Font.BOLD, 80), text, image);
|
||||||
|
|
||||||
|
AttributedString attributedText = new AttributedString(text);
|
||||||
|
attributedText.addAttribute(TextAttribute.FONT, font);
|
||||||
|
attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN);
|
||||||
|
|
||||||
|
Graphics g = image.getGraphics();
|
||||||
|
|
||||||
|
FontMetrics metrics = g.getFontMetrics(font);
|
||||||
|
int positionX = (image.getWidth() - metrics.stringWidth(text));
|
||||||
|
int positionY = (image.getHeight() - metrics.getHeight()) + metrics.getAscent();
|
||||||
|
|
||||||
|
g.drawString(attributedText.getIterator(), positionX, positionY);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Font createFontToFit(Font baseFont, String text, BufferedImage image) throws IOException
|
||||||
|
{
|
||||||
|
Font newFont = baseFont;
|
||||||
|
|
||||||
|
FontMetrics ruler = image.getGraphics().getFontMetrics(baseFont);
|
||||||
|
GlyphVector vector = baseFont.createGlyphVector(ruler.getFontRenderContext(), text);
|
||||||
|
|
||||||
|
Shape outline = vector.getOutline(0, 0);
|
||||||
|
|
||||||
|
double expectedWidth = outline.getBounds().getWidth();
|
||||||
|
double expectedHeight = outline.getBounds().getHeight();
|
||||||
|
|
||||||
|
boolean textFits = image.getWidth() >= expectedWidth && image.getHeight() >= expectedHeight;
|
||||||
|
|
||||||
|
if(!textFits) {
|
||||||
|
double widthBasedFontSize = (baseFont.getSize2D()*image.getWidth())/expectedWidth;
|
||||||
|
double heightBasedFontSize = (baseFont.getSize2D()*image.getHeight())/expectedHeight;
|
||||||
|
|
||||||
|
double newFontSize = widthBasedFontSize < heightBasedFontSize ? widthBasedFontSize : heightBasedFontSize;
|
||||||
|
newFont = baseFont.deriveFont(baseFont.getStyle(), (float)newFontSize);
|
||||||
|
}
|
||||||
|
return newFont;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue