在java中旋转图像而不重新调整大小图像

时间:2015-07-03 15:24:44

标签: java image swing image-rotation

我写下这些代码:

BufferedImage image;
BufferedImage im = image;

    @Override
    public void paint(Graphics g) {
    try {
        image = ImageIO.read(new File("jet.png"));
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(image, 100, 100, Color.BLACK, null);
        image = rotateImage(-45);
        g2.drawImage(image, 250, 100, Color.BLACK, null);
    } catch (IOException ex) {

    }
    }

    public BufferedImage rotateImage(int degress) {

    double deg = Math.toRadians(degress);
    double xrot = image.getWidth()/2 ;
    double yrot = image.getHeight() /2;
    AffineTransform xt = AffineTransform.getRotateInstance(deg, xrot, yrot);
    AffineTransformOp op = new AffineTransformOp(xt, AffineTransformOp.TYPE_BILINEAR);
    return op.filter(image, im);

    }
}

,输出为:

enter image description here

新图像尺寸改变了!我想旋转这个图像,其重要的新图像大小白色改变

我想要一些代码来旋转图像whitout调整大小图像,像这样

enter image description here

2 个答案:

答案 0 :(得分:2)

显示的效果是AffineTransformOp#filter()的特征:" getBounds2D(BufferedImage)返回的矩形的坐标不一定与此方法返回的BufferedImage的坐标相同"相反,将图像绘制到具有旋转图形上下文的BufferedImage,如图here所示。根据需要使用RenderingHints,例如VALUE_ANTIALIAS_ONVALUE_INTERPOLATION_BILINEAR

答案 1 :(得分:2)

首先:

  1. 不要覆盖paint()。自定义绘画是通过覆盖paintComponent(...)来完成的,并且不要忘记方法开头的super.paintComponent(...)。

  2. 不要在绘画方法中进行I / O操作。在类

  3. 的构造函数中读取图像

    旋转90度,180度,270度等以外的方块时,方块的大小会发生变化。所以,问题是你正在使用的drawImage(...)方法的版本:

    g2.drawImage(image, 100, 100, Color.BLACK, null);
    

    您可以分别绘制背景和图像,而不是使用drawImage()方法绘制背景和图像,以便控制背景的大小:

    //g2.drawImage(image, 100, 100, Color.BLACK, null);
    g2.setColor( Color.BLACK );
    g2.fillRect(100, 100, image.getWidth(), image.getHeight());
    g2.drawImage(image, 100, 100, null);
    image = rotateImage(-45);
    g2.fillRect(250, 100, image.getWidth(), image.getHeight());
    g2.drawImage(image, 250, 100, null);