2014-09-23 3 views
1

나는 확장자가 BufferedImage 인 확장 클래스를 생성자에게 제공되는 문자열로 표시해야합니다. 이 작업을 수행하려는 이유는 graphics2D의 앤티 앨리어싱 기능을 허용하는 것입니다. 자세한 내용은 내 previous question을 참조하십시오. 더 좋은 제안이 있으면 꼭 제안하십시오. 이제는 BufferedImage 클래스가 작동하지만 실제 글꼴을 설정하기 전에 입력 문자열을 표시하기 위해 필요한 너비와 높이를 결정하는 방법을 알 수 없습니다. 또한 초기 크기가 설정되면 BufferedImage 부모 크기를 조정하는 방법을 찾을 수 없습니다. 여기 내 코드는 다음과 같습니다.알 수없는 크기의 BufferedImage 만들기

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class Test extends JFrame{ 
    public Test(){ 
     this.add(new JLabel(new ImageIcon(new IconImage("Test", new Font("Sans-Serif", Font.PLAIN, 16))))); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.pack(); 
    } 

    class IconImage extends BufferedImage{ 
     public IconImage(String text, Font font){ 
      super(..., ..., BufferedImage.TYPE_INT_ARGB);//*****Unknown dimensions***** 

      Graphics2D g2d = (Graphics2D) this.getGraphics(); 
      g2d.setFont(font); 
      g2d.setColor(Color.BLACK); 

      int stringHeight = (int) g2d.getFontMetrics().getStringBounds(text, g2d).getHeight(); 
      g2d.drawString(text, 0 , stringHeight); 
      g2d.dispose(); 
     } 
    } 

    public static void main(String[] args){ 
     new Test(); 
    } 
} 

어떤 조언이 있습니까? 감사.

+0

왜 이미지를 먼저 만든 다음 버튼을 만들지 묻는지도 모르겠습니까? 당신이 다른 방향으로 그것을 할 수 있을까요? (만약 그렇다면 : 당신은 버튼을 측정 할 수 있고 그 이미지를 생성 한 후) btw : 컴포넌트보다 큰 그래픽을 디스플레이하는 법 - 작동하지만 클리핑됩니다 ... –

+0

실제 구현은 버튼을 생성하기 때문에'setIcon '및'setRolloverIcon'. 나는'setText'가 호출 된 버튼에 대해서 앤티 앨리어싱을 수행하는 방법을 이해할 수 없었습니다. – Hungry

답변

2

두 가지 가능한 솔루션 :

  1. 가 작은 BufferedImage의 (1 × 1) 단지 그래픽 개체를 얻을하고 계산을 할를 만듭니다. 그런 다음 실제 이미지를 만듭니다.
  2. 임의의 크기의 BufferedImage를 만들고 BufferedImage 크기로 텍스트 크기를 조정합니다. 스케일링 예제는 StandardPrint.preview
+0

포인트 1은 내가 질문을 한 이후로 실제로 작업 한 것입니다. 그것은 다소 둔한 것이지만 작동합니다. 그래서 나는 더 일반적인 방법이 실제로 있는지 알아보기 위해 질문했습니다. – Hungry

+0

저는 1 차 전략을 자주 사용했습니다. –

+0

@AndrewThompson 오, 알았어, 그 정도면 충분할거야. – Hungry

2

비교적 상황 코드 만 발견했습니다. FontMetrics가 필요합니다. GranMics 장치 (화면/프린터)에 따라 다릅니다.

따라서 화면과 호환되는 확대 이미지를 만듭니다.

static BufferedImage textToImage(Font font, String text) { 
    BufferedImage testImg = GraphicsEnvironment.getLocalGraphicsEnvironment() 
      .getDefaultScreenDevice() 
      .getDefaultConfiguration() 
      .createCompatibleImage(1000, 100); 
    FontMetrics fm; 

    Graphics2D g = testImg.createGraphics(); 
    g.setFont(font); 
    fm = g.getFontMetrics(font); 
    Rectangle2D bounds = fm.getStringBounds(text, g); 
    System.out.println("Bounds: " + bounds); 
    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, testImg.getWidth(), testImg.getHeight()); 
    g.setColor(Color.MAGENTA.darker()); 
    g.drawString(text, 0, fm.getHeight() - fm.getDescent()); 
    g.dispose(); 

    Rectangle viewR = new Rectangle(0, 0, 1000, 100); 
    Rectangle iconR = new Rectangle(); 
    Rectangle textR = new Rectangle(); 
    String displayedText = SwingUtilities.layoutCompoundLabel(fm, text, null, 
        SwingConstants.TOP, SwingConstants.LEFT, 0, 0, 
        viewR, iconR, textR, 0); 

    System.out.println("textR: " + textR); 
    BufferedImage img = testImg.getSubimage(0, 0, textR.width, textR.height); 
    return img; 
} 

문자열 경계는 부동 소수점 사각형입니다. 비교를 통해 SwingUtilities.layoutComponentLabel을 사용하면 범위가 반으로 반올림된다는 것을 알 수 있습니다. 글꼴은 픽셀 부분을 날카로운 모서리로 이동시킬 수 있습니다.

관련 문제