Converti il ​​contenuto del testo in Immagine

Esiste una libreria Java che consente di convertire il contenuto del testo in file immagine? So solo di ImageMagick (JMagick in questo caso), ma non vorrei installare alcun binario esterno (la mia app verrà distribuita come file .war in un server Tomcat, quindi non voglio altre dipendenze più di Java) .

Ad esempio, dalla stringa “Ciao”, vorrei generare questa semplice immagine:

L’API grafica 2D dovrebbe essere in grado di raggiungere ciò di cui hai bisogno. Ha anche alcune complesse funzionalità di gestione del testo.

inserisci la descrizione dell'immagine qui

 import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class TextToGraphics { public static void main(String[] args) { String text = "Hello"; /* Because font metrics is based on a graphics context, we need to create a small, temporary image so we can ascertain the width and height of the final image */ BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); Font font = new Font("Arial", Font.PLAIN, 48); g2d.setFont(font); FontMetrics fm = g2d.getFontMetrics(); int width = fm.stringWidth(text); int height = fm.getHeight(); g2d.dispose(); img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); g2d = img.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g2d.setFont(font); fm = g2d.getFontMetrics(); g2d.setColor(Color.BLACK); g2d.drawString(text, 0, fm.getAscent()); g2d.dispose(); try { ImageIO.write(img, "png", new File("Text.png")); } catch (IOException ex) { ex.printStackTrace(); } } } 

Guarda anche Scrivi / Salva e Immagine

Senza alcuna libreria esterna, effettuare le seguenti operazioni:

  1. Misurare la dimensione del testo in pixel (vedi Misurazione del testo )
  2. Creare una java.awt.image.BufferedImage nella giusta dimensione per il testo
  3. Acquisire l’object grafico per BufferedImage usando il metodo createGraphics ()
  4. Disegna il testo
  5. Salvare l’immagine usando la class ImageIO javax

Modifica: risolto il collegamento

Considera il seguente frammento:

 public static final HashMap RenderingProperties = new HashMap<>(); static{ RenderingProperties.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); RenderingProperties.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); RenderingProperties.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); } public static BufferedImage textToImage(String Text, Font f, float Size){ //Derives font to new specified size, can be removed if not necessary. f = f.deriveFont(Size); FontRenderContext frc = new FontRenderContext(null, true, true); //Calculate size of buffered image. LineMetrics lm = f.getLineMetrics(Text, frc); Rectangle2D r2d = f.getStringBounds(Text, frc); BufferedImage img = new BufferedImage((int)Math.ceil(r2d.getWidth()), (int)Math.ceil(r2d.getHeight()), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.setRenderingHints(RenderingProperties); g2d.setBackground(Color.WHITE); g2d.setColor(Color.BLACK); g2d.clearRect(0, 0, img.getWidth(), img.getHeight()); g2d.setFont(f); g2d.drawString(Text, 0, lm.getAscent()); g2d.dispose(); return img; } 

Utilizza solo l’API grafica java per creare un’immagine basata su un font reso su un’immagine buffered.

Ecco un semplice programma per scrivere contenuti grafici in formato png .

 import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; import java.io.File; import javax.imageio.ImageIO; class ImageWriteEx extends JPanel{ public void paint(Graphics g){ Image img = createImageWithText(); g.drawImage(img, 20, 20, this); } private static BufferedImage createImageWithText(){ BufferedImage bufferedImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB); Graphics g = bufferedImage.getGraphics(); g.drawString("www.stackoverflow.com", 20, 20); g.drawString("www.google.com", 20, 40); g.drawString("www.facebook.com", 20, 60); g.drawString("www.youtube.com", 20, 80); g.drawString("www.oracle.com", 20, 1000); return bufferedImage; } public static void main(String[] args){ try{ BufferedImage bi = createImageWithText(); File outputfile = new File("save.png"); ImageIO.write(bi, "png", outputfile); } catch(Exception e){ e.printStackTrace(); } JFrame frame = new JFrame(); frame.getContentPane().add(new ImageWriteEx()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,300); frame.setVisible(true); } }