Wie man Text in Java in der Größe ändert

Ich habe gesehen, dass in Photoshop Text einfach durch Ziehen geändert werden kann. Wie können wir das gleiche in Java machen? Irgendeine Idee, wie man Text in Java ändert? Es wurde ein Schnappschuss des Buchstabens “A” in Photoshop hinzugefügt

Bildbeschreibung hier eingeben


Bitte lassen Sie mich wissen, was mit diesem Code falsch ist?

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); } } 

   

Eine Möglichkeit besteht darin, eine AffineTransform (diese Variante blendet auch die Farbe aus).

Stretch (& verblassen) mit einer Serif-Schriftart für den Text

 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); } } 

Sie können TextLayout , um die Geometrie zu erhalten, wie hier gezeigt. Im Beispiel wird das Bild so skaliert, dass es den Rahmen ausfüllt. JInternalFrame möglicherweise eine gute Wahl, um die Größenänderungsfunktion des Frames zu nutzen. Alternativ zeigt das hier angegebene Beispiel, wie Sie auf mehrere Auswahlen klicken und ziehen.

Bild

Sie können den Typ der Schriftart festlegen

z.B

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

Leider hat die Java API keine native Free-Form Scaling / Transform-Methode.

Sie können jedoch ein BufferedImage- oder Graphics-Objekt mit der scale(x, y) . Sie können also stattdessen einen Ansatz mit “Ebenen” versuchen. Ich zeichne Objekte, wie zB Text, zunächst in ihrer eigenen Ebene (also BufferedImage) und dann auf der eigentlichen Grafikausgabe.

Zeichnen Sie den Text wie gewohnt auf einem BufferedImage und skalieren Sie ihn wie gewünscht. Hier ist ein einfacher Beispielcode, mit dem Sie beginnen können.

 // 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); 

Die tatsächliche Größe der Textebene könnte mit Hilfe des FontMetrics-Objekts bestimmt werden, aber ich überlasse das als Übung für das OP.

Dies kann auf Graphics-Ebene mit Graphics.setTransform() . Ich glaube jedoch, dass es offensichtlich ist, dies auf Font-Ebene mit dem weniger bekannten Font.deriveFont(transform) zu tun. Beispielsweise

 // 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);