21

回転BufferedImageして表示するのに問題があります。回転は問題なく機能していると思いますが、実際には画面に描画できません。私のコード:

Class extends JPanel {
    BufferedImage img;
    int rotation = 0;

    public void paintComponent(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        img2d = img.createGraphics();
        img2d.rotate(Math.toRadians(rotation), img.getWidth() / 2, img.getHeight() / 2);
        g.drawImage(img, imgx, imgy, null);
        this.repaint();
    }
}

これは私にとってはうまくいきません。img2d回転した を に描画する方法が見つかりませんでしたg

編集: に描画されている複数のオブジェクトがあるgため、回転できません。物を個別に回転できるようにする必要があります。

4

3 に答える 3

37

多分あなたはこのように使ってみるべきですAffineTransform:

AffineTransform transform = new AffineTransform();
transform.rotate(radians, bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
bufferedImage = op.filter(bufferedImage, null);

お役に立てれば。

于 2011-02-07T06:20:33.530 に答える
20

私は使用しますGraphics2D.drawImage(image, affinetranform, imageobserver)

以下のコード例では、画像をコンポーネントの中心に回転および移動します。これは結果のスクリーンショットです。

スクリーンショット

public static void main(String[] args) throws IOException {
    JFrame frame = new JFrame("Test");

    frame.add(new JComponent() {
        BufferedImage image = ImageIO.read(
                new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            // create the transform, note that the transformations happen
            // in reversed order (so check them backwards)
            AffineTransform at = new AffineTransform();

            // 4. translate it to the center of the component
            at.translate(getWidth() / 2, getHeight() / 2);

            // 3. do the actual rotation
            at.rotate(Math.PI / 4);

            // 2. just a scale because this image is big
            at.scale(0.5, 0.5);

            // 1. translate the object so that you rotate it around the 
            //    center (easier :))
            at.translate(-image.getWidth() / 2, -image.getHeight() / 2);

            // draw the image
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawImage(image, at, null);

            // continue drawing other stuff (non-transformed)
            //...
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
}
于 2011-02-07T09:50:41.473 に答える
5

画像ではなく、画像に描画するためにグラフィックを回転させています。効果が見られないのはそのためです。ペイントしているグラフィックスに回転を適用すると、回転した画像が描画されます。

public void paintComponent(Graphics g) {
    g.clearRect(0, 0, getWidth(), getHeight());
    g.rotate(Math.toRadians(rotation), img.getWidth() / 2, img.getHeight() / 2);
    g.drawImage(img, imgx, imgy, null);
    this.repaint();
}

これはおそらくあなたが期待するものを完全に描画するわけではなく、回転は座標原点を中心に回転します。画像をその中心を中心に回転させるには、回転の前に座標変換を適用する必要があります。次に例を示します。

g.translate(imgx >> 1, imgy >> 1);

Graphics2D チュートリアルには、さらにいくつかの例があります。

于 2011-02-07T08:25:30.443 に答える