2010-12-04 3 views
2

내 문제는 ..... 이미지를 렌더링하는 Java 응용 프로그램을 가지고 있습니다 ..... 이제 기울어 진 이미지를 렌더링하고 싶습니다. 한 가지 직접적인 접근 방식은 기울어 진 이미지를 렌더링하는 것입니다. 그럼 그것을 렌더링 ...하지만 내 목표는 창에서 마우스 움직임에 따라 이미지를 기울이는 것입니다 ...이 하나의 가능한 해결책은 다양한 기울어 진 각도로 여러 이미지를 가지고 마우스가 움직이면서 렌더링하는 것입니다 ... 하지만 이러한 구현은 정밀도가 제한되어 있으며 원하는 것이 아닙니다. 그래서 이미지가 즉석에서 기울어 지도록 렌더링하는 방법이 있습니까? 사전에자바에서 기울어 진 이미지를 렌더링하는 방법 ..?

감사 ........

답변

2

난 당신이 AffineTransform으로 볼 필요가 있다고 생각이 모양뿐만 아니라 다른 변환을 회전시키는 방법이있다. 기본적으로

An example of how it can be used can be found here

:

AffineTransform at = AffineTransform.getTranslateInstance(width, height); //Create the AffineTransform instance 
at.rotate(someRadianValue); // Apply the transforms you wish 
g2.draw(at.createTransformedShape(myShape)); // Draw the transformed shape 
+0

그래, 그게 도움이 HTML에서 ....... 어떻게 완료입니까? – sasidhar

+2

html이란 무엇입니까? 자바 또는 자바 스크립트 질문입니까? –

+2

@asidhar, ehm ... 자바를 작성했는데, 정확히 어떤 기술을 사용하는지 명확히하면 더 나은 대답을 얻을 수 있습니다. 어쨌든 이것이 HTML/Javascript에서 어떻게 이루어 지는지 나는 모른다. –

4

나는 완전히 이전 게시물에, AffineTransform를 갈 방법입니다 동의합니다. 여기 간단한 예제가 있습니다 ....

import java.awt.*; 
import java.awt.geom.*; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.*; 
import javax.swing.event.*; 

public class RotateImage { 
    private static final int PANEL_WIDTH = 600; 
    private static final Dimension MAIN_SIZE = new Dimension(PANEL_WIDTH, PANEL_WIDTH); 
    private static final int SLIDER_MIN = -180; 
    private static final int SIDER_MAX = 180; 
    private static final int MAJOR_TICK = 30; 
    private static final int MINOR_TICK = 15; 
    private static final String URL_PATH = "http://duke.kenai.com/guitar/DukeAsKeith-daylightSmall.png"; 

    private JPanel mainPanel = new JPanel(); 
    private JPanel drawingPanel = createDrawingPanel(); 
    private AffineTransform transform = new AffineTransform(); 
    private JSlider rotationSlider; 
    private Image image; 

    public RotateImage() { 
     mainPanel.setLayout(new BorderLayout()); 
     mainPanel.add(drawingPanel, BorderLayout.CENTER); 
     mainPanel.add(createTransformPanel(), BorderLayout.SOUTH); 

     URL url; 
     try { 
      url = new URL(URL_PATH); 
      image = ImageIO.read(url); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private JPanel createTransformPanel() { 
     rotationSlider = new JSlider(SLIDER_MIN, SIDER_MAX, 0); 
     rotationSlider.setMajorTickSpacing(MAJOR_TICK); 
     rotationSlider.setMinorTickSpacing(MINOR_TICK); 
     rotationSlider.setPaintLabels(true); 
     rotationSlider.setPaintTicks(true); 
     rotationSlider.setPaintTrack(true); 
     rotationSlider.setSnapToTicks(true); 
     rotationSlider.addChangeListener(new SliderListener()); 

     JPanel transformingPanel = new JPanel(new BorderLayout()); 
     transformingPanel.setBorder(BorderFactory.createEtchedBorder()); 
     transformingPanel.add(rotationSlider); 
     return transformingPanel; 
    } 

    @SuppressWarnings("serial") 
    private JPanel createDrawingPanel() { 
     if (drawingPanel != null) { 
      return drawingPanel; 
     } 
     drawingPanel = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       myPaint(g); 
      } 
     }; 

     drawingPanel.setPreferredSize(MAIN_SIZE); 
     return drawingPanel; 
    } 

    private void myPaint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(3)); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     AffineTransform oldTransform = g2.getTransform(); 
     if (transform != null) { 
      g2.setTransform(transform); 
     } 
     if (image != null) { 
      g2.drawImage(image, 70, 70, null); 
     } 
     g2.setTransform(oldTransform); 
    } 

    public JComponent getPanel() { 
     return mainPanel; 
    } 

    private class SliderListener implements ChangeListener { 
     public void stateChanged(ChangeEvent e) { 
      double theta = Math.PI * rotationSlider.getValue()/180; 
      double center = (double) PANEL_WIDTH/2; 
      transform = AffineTransform.getRotateInstance(theta, center, center); 
      drawingPanel.repaint(); 
     } 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("RotateShape Application"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new RotateImage().getPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
관련 문제