【问题标题】:Graphics2D draw image inside of defined quadrilateralGraphics2D 在定义的四边形内绘制图像
【发布时间】:2011-09-21 16:13:07
【问题描述】:

我在 Graphics2D 中找不到绘图图像过载,这将使我能够执行这样的任务,有人可以帮我弄清楚如何做到这一点 - 最好不要切换到更高级的图形框架,例如 OpenGL,

谢谢。

为了澄清,四边形可以由任何有四个边的东西来定义;这意味着钻石或矩形或更复杂的形状。

Mre 删除了他的许多言论,所以我似乎没有回应任何人,但我在 cmets 中所说的只是对 mre 所说的话的回应。

【问题讨论】:

  • 你的意思是像矩形一样的四边形(所有角都是90度)?如果不是,它可能会变得复杂。我想你必须重新定义你的图像,仍然是一个矩形,但有一些透明的部分,然后在任何地方叠加这个图像。
  • @mre 你误解了我的问题。 @toto 不,并非所有角度都是 90 度。感谢您提出的解决方案,但如果我更改图像源本身,我设置的系统将会失败。
  • @mre 定义四边形:四边形。这并不是假设所有角度都是 90 度。这就是为什么我说四边形而不是矩形。
  • @mre 我不敢相信你竟然对我的问题打分……要问我认为容易理解的问题,这需要做很多工作。你的例子展示了我如何渲染一个矩形——一种特殊的四边形;那不是我要求的。我正在寻找一种可以呈现任何类型的已定义四边形的方法。冷静点,如果你不想帮我找到答案,这个问题不适合你。我不会接受你的借口,你也不需要任何借口。这是一个简单的误解。
  • @Jeremy,我不是在给你找借口。我回答了你问的问题。我提供的示例无关紧要——它们只是示例。查看我提供的图像绘制方法列表。如果这些都不适合您,请使用另一个框架。别再叫我冷静了;这是居高临下的,相当烦人。

标签: java image swing graphics2d


【解决方案1】:

有关基本信息,请参阅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);

【讨论】:

  • 非常感谢!我会试试这个。谢谢。
  • +1,用于纪念剪辑——非常好的和优雅的解决方案。 :)
【解决方案2】:

继承Graphicsimage 绘制方法

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

输出

示例 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);
    }
}

输出

【讨论】:

  • 我不记得说过四边形的所有角度都是 90 度,所以这个解决方案不是我想要的。我很清楚你所说的。不过感谢您的努力:)
  • @Jeremy 使用变换来旋转、缩放和剪切图像
  • @Mre,我知道剪切变换,但它不是我想要的。我在 2d 空间中有四个顶点形成一个四边形,我不能简单地剪切图像 - 我可以,但它可能需要一个未提及的数学公式,所以你的解决方案仍然没有回答这个问题。我不是有意激怒或冒犯你,所以请保持对话干净。
  • @mre 对此感到抱歉。我一定是在谈话中搞混了。
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2012-03-19
相关资源
最近更新 更多