2011-06-24 62 views
2

我无法找到的Graphics2D内平局图像过载,这将使我去执行这样的任务,有人可以帮我找出一个可以如何做到这一点 - 最好是不用交换到更先进的图形框架如OpenGL,在Graphics2D绘制图像的内部定义的四边形

感谢。

为了澄清,四可以通过与四边的任何定义;这意味着钻石或长方形或更复杂的形状。

MRE已经消除了他的许多言论,因此它好像我回答,没有人,但是我都在评论说是什么MRE说的回应。

+0

你的意思是像一个长方形的四边形(90度各个角度)?如果不是,它可能会变得复杂。我想你必须重新定义你的图像,仍然是一个矩形,但有一些透明的部分,然后重叠这个图像的地方。 – toto2

+0

@mre您误解了我的问题。 @toto不,不是所有的角度都是90度。感谢您提供的解决方案,但如果我更改了图像源本身,我设置的系统将被击败。 – Jeremy

+0

@mre 定义四边形:一个四边的图形。那不是假设所有角度都是90度。 因此,我为什么说四边形而不是矩形。 – Jeremy

回答

4

Andrew Thomson's solution为基础。

而不是使用“文字形”的,我创建使用形状:

Polygon polygon = new Polygon(); 
polygon.addPoint(250, 50); 
polygon.addPoint(350, 50); 
polygon.addPoint(450, 150); 
polygon.addPoint(350, 150); 
g.setClip(polygon); 
g.drawImage(originalImage, 0, 0, null); 
+0

非常感谢!我会试试这个。谢谢。 – Jeremy

+0

+1,用于纪念剪辑 - 非常漂亮和优雅的解决方案。 :) – mre

3

继承Graphics图像绘制方法

  1. drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
  2. drawImage(Image img, int x, int y, ImageObserver observer)
  3. drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
  4. drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
  5. drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
  6. drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)

选择你的毒药。由于你甚至无法找到这些,所以我假设在面对缩放和频繁渲染时详细介绍中间图像将是徒劳的。

实施例1 - 画圈在正方形

public class DrawCircleInSquare { 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI(){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JPanel panel = new JPanel(){ 

      @Override 
      protected void paintComponent(Graphics g){ 
       Graphics2D g2 = (Graphics2D)g.create(); 

       // Clear background to white 
       g2.setColor(Color.WHITE); 
       g2.clearRect(0, 0, getWidth(), getHeight()); 

       // Draw square 
       g2.setColor(Color.BLACK); 
       g2.drawRect(50, 50, 100, 100); 

       // Draw circle inside square 
       g2.setColor(Color.RED); 
       g2.fillOval(88, 88, 24, 24); 

       g2.dispose(); 
      } 

      @Override 
      public Dimension getPreferredSize(){ 
       return new Dimension(200, 200); 
      } 
     }; 

     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

输出

enter image description here

实施例2 - 在一个正方形

绘制图像
public class DrawImageInSquare { 

    private static BufferedImage bi; 

    public static void main(String[] args){ 
     try { 
      // Load image 
      loadImage(); 

      // Create and show GUI 
      SwingUtilities.invokeLater(new Runnable(){ 
       @Override 
       public void run() { 
        createAndShowGUI(); 
       } 
      }); 
     } catch (IOException e) { 
      // handle exception 
     } 
    } 

    private static void loadImage() throws IOException{ 
     bi = ImageIO.read(new File("src/resources/psyduck.png")); 
    } 

    private static void createAndShowGUI(){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JPanel panel = new JPanel(){ 

      @Override 
      protected void paintComponent(Graphics g){ 
       Graphics2D g2 = (Graphics2D)g.create(); 

       // Clear background to white 
       g2.setColor(Color.WHITE); 
       g2.clearRect(0, 0, getWidth(), getHeight()); 

       // Draw square 
       g2.setColor(Color.BLACK); 
       g2.drawRect(50, 50, 100, 100); 

       // Draw image inside square 
       g2.setRenderingHint(
         RenderingHints.KEY_INTERPOLATION, 
         RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
       g2.drawImage(bi, 50, 50, 100, 100, null); 

       g2.dispose(); 
      } 

      @Override 
      public Dimension getPreferredSize(){ 
       return new Dimension(200, 200); 
      } 
     }; 

     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

输出

enter image description here

+0

+1好的答案! –

+1

我不记得说四边形的所有角度都是90度,所以这个解决方案不是我要找的。我很清楚你所说的。谢谢你的努力:) – Jeremy

+1

@Jeremy使用转换来旋转,缩放和剪切图像 –