如何在 Java 中旋转 imageIcon
How to rotate an imageIcon in Java
我正在 java 中创建多米诺骨牌游戏。我有以下代码加载、调整大小然后在屏幕上显示多米诺骨牌图像:
ImageIcon imageIcon = new ImageIcon("images\4-4.png");
Image image = imageIcon.getImage();
Image newimg = image.getScaledInstance(60, 120, java.awt.Image.SCALE_SMOOTH);
imageIcon = new ImageIcon(newimg);
JLabel img = new JLabel(imageIcon);
img.setBounds(100, 100, 60, 120);
getContentPane().add(img);
我想做的是将图像旋转 90 度或 -90 度。我在网上搜索过,但我找到的例子似乎很复杂。
知道如何旋转图像吗?
顺便说一句,如果您认为这不是在多米诺骨牌游戏中显示多米诺骨牌的正确方法,请告诉我。我是 java 新手。
旋转图像并不简单,即使只是 90 度也需要一定的工作量。
因此,基于几乎所有其他关于旋转图像的问题,我将从类似...
public BufferedImage rotate(BufferedImage image, Double degrees) {
// Calculate the new size of the image based on the angle of rotaion
double radians = Math.toRadians(degrees);
double sin = Math.abs(Math.sin(radians));
double cos = Math.abs(Math.cos(radians));
int newWidth = (int) Math.round(image.getWidth() * cos + image.getHeight() * sin);
int newHeight = (int) Math.round(image.getWidth() * sin + image.getHeight() * cos);
// Create a new image
BufferedImage rotate = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotate.createGraphics();
// Calculate the "anchor" point around which the image will be rotated
int x = (newWidth - image.getWidth()) / 2;
int y = (newHeight - image.getHeight()) / 2;
// Transform the origin point around the anchor point
AffineTransform at = new AffineTransform();
at.setToRotation(radians, x + (image.getWidth() / 2), y + (image.getHeight() / 2));
at.translate(x, y);
g2d.setTransform(at);
// Paint the originl image
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return rotate;
}
虽然您只旋转了 90 度,但这会计算新图像所需的尺寸,以便能够以任何角度绘制旋转后的图像。
然后它简单地利用 AffineTransform
来操纵绘画发生的原点 - 习惯这个,你会做很多。
然后,我加载图像,旋转它们并显示它们...
try {
BufferedImage original = ImageIO.read(getClass().getResource("domino.jpg"));
BufferedImage rotated90 = rotate(original, 90.0d);
BufferedImage rotatedMinus90 = rotate(original, -90.0d);
JPanel panel = new JPanel();
panel.add(new JLabel(new ImageIcon(original)));
panel.add(new JLabel(new ImageIcon(rotated90)));
panel.add(new JLabel(new ImageIcon(rotatedMinus90)));
JOptionPane.showMessageDialog(null, panel, null, JOptionPane.PLAIN_MESSAGE, null);
} catch (IOException ex) {
ex.printStackTrace();
}
我更喜欢使用 ImageIO
来加载图像,因为它会在出现问题时抛出 IOException
,而不是像 ImageIcon
.
那样默默地失败
您还应该将资源嵌入到应用程序的上下文中,这样可以更轻松地在运行时加载它们。根据 IDE 和项目的设置方式,您的操作方式会有所不同,但在 "most" 情况下,您应该能够将资源直接添加到源目录(最好在子目录中) IDE 将在您导出项目时提供给您并打包它
解决方案来自:http://www.java2s.com/Code/Java/Advanced-Graphics/RotatingaBufferedImage.htm
AffineTransform tx = new AffineTransform();
tx.rotate(0.5, bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_BILINEAR);
bufferedImage = op.filter(bufferedImage, null);
我正在 java 中创建多米诺骨牌游戏。我有以下代码加载、调整大小然后在屏幕上显示多米诺骨牌图像:
ImageIcon imageIcon = new ImageIcon("images\4-4.png");
Image image = imageIcon.getImage();
Image newimg = image.getScaledInstance(60, 120, java.awt.Image.SCALE_SMOOTH);
imageIcon = new ImageIcon(newimg);
JLabel img = new JLabel(imageIcon);
img.setBounds(100, 100, 60, 120);
getContentPane().add(img);
我想做的是将图像旋转 90 度或 -90 度。我在网上搜索过,但我找到的例子似乎很复杂。
知道如何旋转图像吗?
顺便说一句,如果您认为这不是在多米诺骨牌游戏中显示多米诺骨牌的正确方法,请告诉我。我是 java 新手。
旋转图像并不简单,即使只是 90 度也需要一定的工作量。
因此,基于几乎所有其他关于旋转图像的问题,我将从类似...
public BufferedImage rotate(BufferedImage image, Double degrees) {
// Calculate the new size of the image based on the angle of rotaion
double radians = Math.toRadians(degrees);
double sin = Math.abs(Math.sin(radians));
double cos = Math.abs(Math.cos(radians));
int newWidth = (int) Math.round(image.getWidth() * cos + image.getHeight() * sin);
int newHeight = (int) Math.round(image.getWidth() * sin + image.getHeight() * cos);
// Create a new image
BufferedImage rotate = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotate.createGraphics();
// Calculate the "anchor" point around which the image will be rotated
int x = (newWidth - image.getWidth()) / 2;
int y = (newHeight - image.getHeight()) / 2;
// Transform the origin point around the anchor point
AffineTransform at = new AffineTransform();
at.setToRotation(radians, x + (image.getWidth() / 2), y + (image.getHeight() / 2));
at.translate(x, y);
g2d.setTransform(at);
// Paint the originl image
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return rotate;
}
虽然您只旋转了 90 度,但这会计算新图像所需的尺寸,以便能够以任何角度绘制旋转后的图像。
然后它简单地利用 AffineTransform
来操纵绘画发生的原点 - 习惯这个,你会做很多。
然后,我加载图像,旋转它们并显示它们...
try {
BufferedImage original = ImageIO.read(getClass().getResource("domino.jpg"));
BufferedImage rotated90 = rotate(original, 90.0d);
BufferedImage rotatedMinus90 = rotate(original, -90.0d);
JPanel panel = new JPanel();
panel.add(new JLabel(new ImageIcon(original)));
panel.add(new JLabel(new ImageIcon(rotated90)));
panel.add(new JLabel(new ImageIcon(rotatedMinus90)));
JOptionPane.showMessageDialog(null, panel, null, JOptionPane.PLAIN_MESSAGE, null);
} catch (IOException ex) {
ex.printStackTrace();
}
我更喜欢使用 ImageIO
来加载图像,因为它会在出现问题时抛出 IOException
,而不是像 ImageIcon
.
您还应该将资源嵌入到应用程序的上下文中,这样可以更轻松地在运行时加载它们。根据 IDE 和项目的设置方式,您的操作方式会有所不同,但在 "most" 情况下,您应该能够将资源直接添加到源目录(最好在子目录中) IDE 将在您导出项目时提供给您并打包它
解决方案来自:http://www.java2s.com/Code/Java/Advanced-Graphics/RotatingaBufferedImage.htm
AffineTransform tx = new AffineTransform();
tx.rotate(0.5, bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_BILINEAR);
bufferedImage = op.filter(bufferedImage, null);