在另一个图像上旋转图像

用户名

我有一种方法,当用户输入旋转度数时,我想旋转图像。该方法可以做到这一点,但实际上是旋转图像,以便新图像位于旧图像之上(我不希望这样做;我只希望新图像本身)。RotateTest只是该类的缩写形式,它包含ButtonListener类中所需的所有与旋转图像有关的方法。

public class RotateTest {
    public Rotate() {
        try {
            String path = "default.jpg";
            File imageFile = new File(path);
            imageURL = imageFile.toURI().toURL();
            image = ImageIO.read(imageURL);
            this.imageLabel = new JLabel(imageLabel);
        } catch (IOException e) { }
    }

    public void setAngle(double angle) {
        this.angle = angle;
    }

    public void setImage(BufferedImage img) {
        this.image = img;
    }

private class ButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        boolean doAgain = true;
        Artsy artsy = new Artsy();
    if(event.getSource() == rotate) {
            //need something for cancel!
            do {
                String angleString = JOptionPane.showInputDialog("Please enter your angle in degrees.");
                double angle = Double.parseDouble(angleString);
                if(angle < 0) {
                    angle = 360 + angle;
                }
                setAngle(getAngle() + angle);
                setImage(artsy.doRotate(image, angle));
                revalidate();
                repaint();
                System.out.println("The angle is " + getAngle());
            } while(JOptionPane.OK_OPTION == 1);
        }
        else {
            if(doAgain) {
                setImage(artsy.doRotate(image, 360 - getAngle()));
                doAgain = false;
                setAngle(0);
            }
            revalidate();
            repaint();
            System.out.println("The angle is " + getAngle());
        }
}

}

这是带有旋转图像方法的另一个类:

public class Artsy {
    public BufferedImage doRotate(BufferedImage src, double angle) {    
        angle = Math.toRadians(angle);
        Graphics2D g = (Graphics2D) src.getGraphics();      
        int w = src.getWidth();
        int h = src.getHeight();
        AffineTransform trans = new AffineTransform();
        trans.rotate(angle, w / 2, h / 2);
        AffineTransformOp scaleOp = new AffineTransformOp(trans, AffineTransformOp.TYPE_BILINEAR);
        g.drawImage(scaleOp.filter(src, null), 0, 0, null);
        g.dispose();
        return src;
    }
}

谢谢!!

亚历克斯

您的代码对我来说似乎是正确的,我看不到明显的错误。不过,以下功能对于我来说可以旋转图像,因此它也应该是您的解决方案:

public static BufferedImage rotate(BufferedImage srcImage, double angle)
{
    double sin = Math.abs(Math.sin(Math.toRadians(angle))), cos = Math.abs(Math.cos(Math.toRadians(angle)));

    int originWidth = srcImage.getWidth(), originHeight = srcImage.getHeight();

    int newWidth = (int) Math.floor(originWidth * cos + originHeight * sin), newHeight = (int) Math.floor(originHeight * cos + originWidth * sin);

    BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = newImage.createGraphics();

    g.translate((newWidth - originWidth) / 2, (newHeight - originHeight) / 2);
    g.rotate(Math.toRadians(angle), originWidth / 2, originHeight / 2);
    g.drawImage(srcImage, 0, 0, null);
    g.dispose();

    return newImage;
}

辅助功能:

/**
 * Converts an Icon to an Image
 */
public static Image iconToImage(Icon icon) {
    if (icon instanceof ImageIcon) {
        return ((ImageIcon) icon).getImage();
    }
    else {
        int w = icon.getIconWidth();
        int h = icon.getIconHeight();
        GraphicsEnvironment ge =
                GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        BufferedImage image = gc.createCompatibleImage(w, h);
        Graphics2D g = image.createGraphics();
        icon.paintIcon(null, g, 0, 0);
        g.dispose();
        return image;
    }
}

JLabels图标顺时针旋转90度的示例用法

BufferedImage buImg = new BufferedImage(imageLabel.getIcon().getIconWidth(), imageLabel.getIcon().getIconHeight(), BufferedImage.TYPE_INT_ARGB);
buImg.getGraphics().drawImage(iconToImage(imageLabel.getIcon()), 0, 0, null);
imageLabel.setIcon(new ImageIcon(rotate(buImg, 90)));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算另一个图像的旋转角度图像

来自分类Dev

将图像淡入另一个图像过渡

来自分类Dev

在另一个图像上实现图像

来自分类Dev

如何从另一个给定的图像恢复图像

来自分类Dev

在另一个图像上添加图像-OpenTK

来自分类Dev

在另一个图像中添加图像

来自分类Dev

在另一个图像周围对齐图像?

来自分类Dev

在另一个图像中拖动多个图像

来自分类Dev

使用CSS或Jquery将一个图像淡入另一个图像

来自分类Dev

使用PIL将一个图像复制到另一个图像

来自分类Dev

Fabric Js将一个图像拖到另一个图像上

来自分类Dev

Matlab-在一个图像中识别与另一个图像重叠的对象

来自分类Dev

将一个图像放在另一个图像之上

来自分类Dev

将一个cv :: mat图像叠加在另一个图像上

来自分类Dev

将UIButton图像从一个图像过渡到另一个

来自分类Dev

HTML CSS-将一个图像放置在另一个图像上

来自分类Dev

如何在另一个图像上设置一个图像?

来自分类Dev

在另一个图像上绘制一个图像

来自分类Dev

在matplotlib中将一个图像动画化为另一个图像

来自分类Dev

在另一个图像中大约定位一个图像

来自分类Dev

CSS将一个图像放置在另一个图像上

来自分类Dev

如何将一个图像浮动在另一个图像之上?

来自分类Dev

如何使用画布将一个图像粘贴到另一个图像?

来自分类Dev

合并一个图像覆盖另一个图像

来自分类Dev

如何显示一个图像查看另一个图像?

来自分类Dev

从另一个图像中删除一个重叠图像

来自分类Dev

CABasicAnimation处理一个图像,但不处理另一个图像

来自分类Dev

如何将一个图像放在另一个图像之上?

来自分类Dev

将一个cv :: mat图像叠加在另一个图像上

Related 相关文章

热门标签

归档