Cómo cambiar el tamaño del texto en Java

He visto que en el texto de Photoshop se puede cambiar el tamaño fácilmente simplemente arrastrándolos. ¿Cómo podemos hacer lo mismo en Java? ¿Alguna idea sobre cómo cambiar el tamaño del texto en Java? Se agregó una instantánea de la letra “A” redimensionada en photoshop

enter image description here


Por favor, hágame saber lo que está mal con este código?

public class ResizeImage extends JFrame { public ResizeImage(){ JPanel panel = new JPanel(){ public void paintComponent(Graphics g) { // In your paint(Graphics g) method // Create a buffered image for use as text layer BufferedImage textLayer = new BufferedImage(240, 240, BufferedImage.TYPE_INT_RGB); // Get the graphics instance of the buffered image Graphics2D gBuffImg = textLayer.createGraphics(); // Draw the string gBuffImg.drawString("Hello World", 10, 10); // Rescale the string the way you want it gBuffImg.scale(200, 50); // Draw the buffered image on the output's graphics object g.drawImage(textLayer, 0, 0, null); gBuffImg.dispose(); } }; add(panel); } public static void main(String [] args){ ResizeImage frame = new ResizeImage(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); } } 

Una forma es usar una AffineTransform (esta variante también desvanece el color).

Estirar (y fundir) usando una fuente Serif para el texto

 import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import javax.swing.*; import java.io.File; import javax.imageio.ImageIO; public class StretchText { public static void main(String[] args) throws Exception { // used to stretch the graphics instance sideways AffineTransform stretch = new AffineTransform(); int w = 640; // image width int h = 200; // image height int f = 21; // Font size in px String s = "The quick brown fox jumps over the lazy dog."; final BufferedImage bi = new BufferedImage( w,h,BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); g.setFont(new Font("Serif",Font.PLAIN,f)); g.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); // paint BG g.setColor(Color.WHITE); g.fillRect(0, 0, w, h); g.setColor(Color.BLACK); for (int i=0; (i*f)+f<=h; i++) { g.drawString(s, 0, (i*f)+f); // stretch stretch.concatenate( AffineTransform.getScaleInstance(1.18, 1d)); g.setTransform(stretch); // fade Color c = g.getColor(); g.setColor(new Color ( c.getRed(), c.getGreen(), c.getBlue(), (int)(c.getAlpha()*.75))); } g.dispose(); ImageIO.write(bi, "png", new File( new File(System.getProperty("user.home")), "StretchText.png")); Runnable r = new Runnable() { @Override public void run() { JLabel gui = new JLabel(new ImageIcon(bi)); JOptionPane.showMessageDialog(null, gui); } }; SwingUtilities.invokeLater(r); } } 

Puede usar TextLayout para obtener la geometría, como se muestra aquí . El ejemplo escala la imagen para llenar el cuadro. JInternalFrame podría ser una buena opción para aprovechar la función de cambio de tamaño del marco. Alternativa, el ejemplo citado aquí muestra cómo hacer clic y arrastrar varias selecciones.

imagen

Puedes definir el tipo de letra

p.ej

 Font f = new Font("SansSerif", Font.BOLD, 40) 

Desafortunadamente, la API java no tiene una fuente nativa de escalado / transformación de fonts.

Sin embargo, puede cambiar la escala de un objeto BufferedImage o Graphics con el método de scale(x, y) . Entonces puedes probar un enfoque con “capas”. Es decir, dibujar objetos, como texto, en su propia capa (es decir, una Imagen Buffered) primero y luego en la salida de gráficos reales.

Así que dibuje el texto como de costumbre en una Imagen Buffered y vuelva a escalarlo de la manera que desee. Aquí hay un código de muestra simple para comenzar.

 // In your paint(Graphics g) method // Create a buffered image for use as text layer BufferedImage textLayer = new BufferedImage(240, 240, BufferedImage.TYPE_INT_ARGB); // Get the graphics instance of the buffered image Graphics2D gBuffImg = buffImg.createGraphics(); // Draw the string gBuffImg.drawString("Hello World", 0, 0); // Rescale the string the way you want it gBuffImg.scale(240, 120); // Draw the buffered image on the output's graphics object g.drawImage(gBuffImg, 0, 0, null); 

El tamaño real de la capa de texto podría determinarse con la ayuda del objeto FontMetrics, pero lo dejo como ejercicio para el OP.

Esto se puede hacer en el nivel de Graphics.setTransform() usando Graphics.setTransform() . Sin embargo, creo que es más obvio hacerlo a nivel de Fuente utilizando Font.deriveFont(transform) menos conocido. Por ejemplo

 // create transform AffineTransform affineTransform = new AffineTransform(); affineTransform.scale(1d, 3d); // create font using that transform Font stretchedFont = g.getFont().deriveFont(affineTransform); // set font as normal g.setFont(stretchedFont); // render as normal g.drawString("Stretched", 23, 45);