2012-11-18 22 views
5

Widziałem, że w tekście programu Photoshop można łatwo zmienić rozmiar, przeciągając je. Jak możemy zrobić to samo w Javie? Masz pomysł na zmianę rozmiaru tekstu w java? Dodano migawkę literą „A” o zmienionym rozmiarze w photoshopieJak zmienić rozmiar tekstu w java

enter image description here


Proszę dać mi znać, co jest nie tak z tym kodem?

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

Można wyrenderować czcionkę na "BufferedImage", a następnie zmienić jej rozmiar tak, jak chcesz. – Spoike

+2

Czy to nie najwyższy czas, abyś *** przyjął *** odpowiedź na to pytanie lub wyjaśnił, dlaczego oferowane odpowiedzi nie były odpowiednie? –

Odpowiedz

3

u można określić rodzaj czcionki

np

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

Rozmiar czcionki 40 zwiększyłby zarówno szerokość, jak i wysokość litery. Ale jak widać na powyższym obrazku, zwiększa się tylko szerokość. Jak to osiągnąć? – user001

11

Jednym ze sposobów jest użyć AffineTransform (wariant ten zanika również kolor).

Stretch (& fade) using a Serif font for the 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); 
    } 
} 
1

Niestety Java API nie posiada natywną nieregularnym kształcie skalowanie/przekształcać czcionek metod.

Można jednak przeskalować obraz BufferedImage lub Graphics za pomocą scale(x, y) method. Możesz więc spróbować podejścia z "warstwami". To znaczy. narysuj obiekty, takie jak tekst, w ich własnej warstwie (to jest w BufferedImage), a następnie w rzeczywistych wynikach grafiki.

Narysuj tekst jak zwykle na obrazie BufferedImage i przeskaluj go tak, jak chcesz. Oto prosty przykładowy kod, który pomoże Ci zacząć.

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

Rzeczywista wielkość warstwy tekstowej można określić za pomocą tych FontMetrics obiektu, ale zostawię to jako ćwiczenie dla PO.

4

Możesz użyć TextLayout, aby uzyskać geometrię, jak pokazano here. Przykład skaluje obraz, aby wypełnić ramkę. JInternalFrame może być dobrym wyborem do wykorzystania funkcji zmiany rozmiaru ramki. Alternatywnie, przykład cytowany here pokazuje, jak klikać i przeciągać wiele zaznaczeń.

image

+0

Cześć To właśnie szukałem. Sprawdzę to i spróbuję zobaczyć, czy mogę sprawić, by był dynamiczny ... Jeszcze raz dziękuję – user001

+1

Po prostu zmień rozmiar okna. – trashgod

+0

Być może dodać "zegar", który rozciąga go od lokalizacji po platformie (rozmiar domyślny) do rozmiaru ekranu, piksel po pikselu? Chociaż tytuł "Rozciągnij mnie" również może to zrobić. ;) –

0

Można to zrobić na grafikę poziomu za pomocą Graphics.setTransform(). Jednak uważam, że jest to bardziej oczywiste, aby zrobić to na poziomie czcionki przy użyciu mniejszego znanego Font.deriveFont(transform). Na przykład:

// 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); 
Powiązane problemy