2012-11-13 5 views
1

Java에서 이미지 처리에 대해 질문하고 싶습니다.텍스트와 그림을 이미지에 추가하십시오.

내가 찾고있는 것은 기존 이미지 아래에 텍스트를 넣는 것입니다. 기존 이미지가 아닌 이미지 하단에 추가합니다. 나는 그것에 대해 봤지만 모든 대답은 후자를 어떻게 할 것인지에 대한 제안이었습니다. 텍스트를 이미지 위에 올려 놓는 방법이었습니다.

아래 그림은 내가 원하는 결과입니다. 원본 그림은 Leena 이미지이고 이미지 처리 결과는 빨간색 점선 아래에 있습니다.

desired result

이를 달성하기 위해 가장 빠른 방법이 될 수 무엇 - 다른 작은 사진을 추가 또한 이미지 아래 텍스트를 작성하고 있습니까?

필자가 생각한 바에 따르면 내 배경에 BufferedImage 하단 30 픽셀의 높이를 추가 한 다음 그 위치에 텍스트를 쓰고 로고를 추가합니다. 이것이 가장 효율적인 방법일까요? 저를 위해 그 일을 할 수있는 libs가 있습니까? 아니면 내가 언급 한 것보다 나은 접근법이 있습니까?

편집 : 더 명확하게하기 위해 나는 한 장의 사진으로 결과를 원하는

+0

사업부에 대한) 사실 로고, 당신은 제안 된 독서 목록을 읽을 수 및 그 달성 할 것입니다 방법을 알아낼 수있을 것를 렌더링하는 코드를 추가 귀찮게하지했습니다 이미지. div의 텍스트 – gmustudent

+0

@ gmustudent 죄송합니다. 그 결과는 하나의 그림이되고 Java로 수행됩니다. – Skyzer

+0

준비가 완료되면 이미지를 어디에 표시하고 있습니까? 브라우저? – gmustudent

답변

2

나는

을 통해 읽기를하는 데 시간이 걸릴 것

이것은 정말 기본적인 예입니다.

enter image description here

public class AppendImage { 

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

    public AppendImage() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new ImagePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ImagePane extends JPanel { 

     private BufferedImage sourceImage; 
     private BufferedImage labeledImage; 

     public ImagePane() { 

      try { 
       sourceImage = ImageIO.read(getClass().getResource("/source.jpg")); 
       labeledImage = addLabel("Hello", sourceImage); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      int width = sourceImage.getWidth() + labeledImage.getWidth(); 
      int height = labeledImage.getHeight(); 

      return new Dimension(width, height); 
     } 

     protected BufferedImage addLabel(String label, BufferedImage sourceImage) { 

      Font font = UIManager.getFont("Label.font"); 
      FontMetrics fm = getFontMetrics(font); 
      int width = sourceImage.getWidth() + 2; 
      int height = sourceImage.getHeight() + 4 + fm.getHeight() + 4; 

      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2d = image.createGraphics(); 
      g2d.setColor(Color.WHITE); 
      g2d.fillRect(0, 0, width, height); 
      g2d.setColor(Color.BLACK); 
      g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
      g2d.drawRect(0, 0, width - 1, height - 1); 
      g2d.drawImage(sourceImage, 1, 1, this); 
      g2d.setColor(Color.RED); 
      g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 10f, new float[]{10f}, 0f)); 
      g2d.drawLine(0, sourceImage.getHeight() + 2, image.getWidth(), sourceImage.getHeight() + 2); 

      int y = sourceImage.getHeight() + (((image.getHeight() - sourceImage.getHeight()) - fm.getHeight())/2) + 2; 
      g2d.drawString(label, 2, y + fm.getAscent()); 

      String logo = "Logo here"; 
      int x = image.getWidth() - fm.stringWidth(logo) - 12; 
      g2d.drawString(logo, x, y + fm.getAscent()); 

      g2d.dispose(); 

      return image; 

     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int x = 0; 
      g.drawImage(sourceImage, x, 0, this); 
      x += sourceImage.getWidth(); 
      g.drawImage(labeledImage, x, 0, this); 
     } 
    } 
} 
관련 문제