5

Photoshop では、テキストをドラッグするだけで簡単にサイズを変更できることがわかりました。Java で同じことを行うにはどうすればよいでしょうか。Javaでテキストのサイズを変更する方法について何か考えはありますか? Photoshop でサイズ変更された文字「A」のスナップショットを追加

ここに画像の説明を入力


このコードの何が問題なのか教えてください。

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

5 に答える 5

11

1つの方法は、を使用することですAffineTransform(このバリアントも色を薄くします)。

テキストにSerifフォントを使用してストレッチ(&フェード)

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);
    }
}
于 2012-11-18T13:25:21.030 に答える
4

ここに示すように、を使用TextLayoutしてジオメトリを取得できます。この例では、画像をスケーリングしてフレームを埋めます。フレームのサイズ変更機能を利用するのに適している場合があります。別の方法として、ここで引用されている例は、複数の選択をクリックしてドラッグする方法を示しています。JInternalFrame

画像

于 2012-11-18T15:18:49.820 に答える
3

フォントの種類を定義できます

例えば

Font f = new Font("SansSerif", Font.BOLD, 40)
于 2012-11-18T12:54:28.730 に答える
1

残念ながら、Java API には、ネイティブな自由形式のスケーリング/変換方法のフォントがありません。

scale(x, y)ただし、メソッドを使用して BufferedImage または Graphics オブジェクトを再スケーリングできます。したがって、代わりに「レイヤー」を使用したアプローチを試すことができます。つまり、テキストなどのオブジェクトを最初に独自のレイヤー (つまり BufferedImage) に描画し、次に実際のグラフィックス出力に描画します。

したがって、通常どおり BufferedImage にテキストを描画し、必要に応じてサイズを変更します。開始するための簡単なサンプル コードを次に示します。

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

テキスト レイヤーの実際のサイズは、FontMetrics オブジェクトを使用して決定できますが、これは OP の課題として残します。

于 2012-11-18T13:49:51.377 に答える