【问题标题】:rotate Image without re-size image in java在java中旋转图像而不重新调整图像大小
【发布时间】:2015-07-03 15:24:43
【问题描述】:

我写了这段代码:

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

    }
}

输出是:

并且新的图像尺寸发生了变化!!!我想旋转这张图片,它的重要的新图片尺寸没有变化

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

【问题讨论】:

  • 您可以用一张图片替换另一张图片。
  • @AndrewTobilko 我只想使用一张图片!!!!
  • 你试过Scalr库,它可以保持你的图像大小,并旋转它。但是如果图像不是正方形,那么它的尺寸当然会改变。
  • @NaniNakhli,添加答案,好吗?
  • @AndrewTobilko 这一行有错误:GraphicsConfiguration gc = getDefaultConfiguration();

标签: java image swing image-rotation


【解决方案1】:

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

【讨论】:

  • 这是我的代码示例!我的代码有 11 个用于绘制的图像,我想旋转其中一个
  • 如果您使用here 提到的方法之一使背景透明,可能会更容易。
【解决方案2】:

首先:

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

  2. 不要在绘画方法中执行 I/O。在类的构造函数中读取图片

当您旋转 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);

【讨论】:

  • tnx 为您解答我绘制背景以显示图像大小!原始尺寸的图像很重要,因为我想在我的代码中使用 image.getWidth()image.getHeight() 进行其他工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2017-08-22
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多