- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这里有一个尺寸为 2156x1728 的黑白 png 文件,我想使用 AffineTransform 将其旋转 90 度。生成的图像比例不正确。这里是一些示例代码(假设我已成功将 png 文件加载到 BufferedImage 中):
public BufferedImage transform(BufferedImage image){
System.out.println("Input width: "+ image.getWidth());
System.out.println("Input height: "+ image.getHeight());
AffineTransform affineTransform = new AffineTransform();
affineTransform.setToQuadrantRotation(1, image.getWidth() / 2, image.getHeight() / 2);
AffineTransformOp opRotated = new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR);
BufferedImage transformedImage = opRotated.createCompatibleDestImage(image, image.getColorModel());
System.out.println("Resulting width: "+ transformedImage.getWidth());
System.out.println("Resulting height: "+ transformedImage.getHeight());
transformedImage = opRotated.filter(image, transformedImage);
return transformedImage;
}
相应的输出是:
Input width: 2156
Input height: 1728
Resulting width: 1942
Resulting height: 1942
为什么旋转会返回如此完全不相关的维度?
最佳答案
我不是这方面的专家,但为什么不创建一个正确大小的 BufferedImage 呢?另请注意,您的旋转中心不正确。您需要以 [w/2, w/2] 或 [h/2, h/2] 为中心旋转(w 是宽度,h 是高度),具体取决于您要旋转到的象限,1 或 3 ,以及图像的相对高度和宽度。例如:
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class RotateImage {
public static final String IMAGE_PATH = "http://duke.kenai.com/"
+ "models/Duke3DprogressionSmall.jpg";
public static void main(String[] args) {
try {
URL imageUrl = new URL(IMAGE_PATH);
BufferedImage img0 = ImageIO.read(imageUrl);
ImageIcon icon0 = new ImageIcon(img0);
int numquadrants = 1;
BufferedImage img1 = transform(img0, numquadrants );
ImageIcon icon1 = new ImageIcon(img1);
JOptionPane.showMessageDialog(null, new JLabel(icon0));
JOptionPane.showMessageDialog(null, new JLabel(icon1));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static BufferedImage transform(BufferedImage image, int numquadrants) {
int w0 = image.getWidth();
int h0 = image.getHeight();
int w1 = w0;
int h1 = h0;
int centerX = w0 / 2;
int centerY = h0 / 2;
if (numquadrants % 2 == 1) {
w1 = h0;
h1 = w0;
}
if (numquadrants % 4 == 1) {
if (w0 > h0) {
centerX = h0 / 2;
centerY = h0 / 2;
} else if (h0 > w0) {
centerX = w0 / 2;
centerY = w0 / 2;
}
// if h0 == w0, then use default
} else if (numquadrants % 4 == 3) {
if (w0 > h0) {
centerX = w0 / 2;
centerY = w0 / 2;
} else if (h0 > w0) {
centerX = h0 / 2;
centerY = h0 / 2;
}
// if h0 == w0, then use default
}
AffineTransform affineTransform = new AffineTransform();
affineTransform.setToQuadrantRotation(numquadrants, centerX, centerY);
AffineTransformOp opRotated = new AffineTransformOp(affineTransform,
AffineTransformOp.TYPE_BILINEAR);
BufferedImage transformedImage = new BufferedImage(w1, h1,
image.getType());
transformedImage = opRotated.filter(image, transformedImage);
return transformedImage;
}
}
编辑 1
您问:
can you explain to me why it must be [w/2, w/2] or [h/2, h/2] ?
为了最好地解释这一点,最好可视化并物理操作一个矩形:
剪出一张矩形纸并将其放在一张纸上,使其左上角位于该纸的左上角上 - 这就是您在屏幕上的图像。现在检查一下需要将矩形旋转 1 或 3 个象限的位置,以便其新的左上角覆盖纸张的左上角,您就会明白为什么需要使用 [w/2, w/2] 或[h/2,h/2]。
关于java - AffineTransform 截断图像,我错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719473/
我有几个不同坐标的几何形状,我想将它们放在面板的中心。我编写了一个名为“Set Scale”的函数,它将它置于中心,但形状是相反的。 我的代码: private void SetScale1(Grap
我从此方法调用我的绘制类: @Override protected void paintComponent(Graphics g) { super.paintComponent(g);
我正在尝试用java awt绘制一个矩形,并通过鼠标拖动使其随鼠标光标旋转。 当我测试它时,矩形旋转得快得离谱。 我的矩形(): private Rectangle2D rec = new Recta
我在使用图像而不是 vector 图形开发我的第一个 Java 游戏时遇到了一些麻烦。目前,我正在尝试使用 AffineTransform 对象在按键时移动图像。只是它不会动。我究竟做错了什么?我还没
我正在尝试使用 AffineTransform 创建一个简单的矩形。这就是我想做的事情...... AffineTransform at = new AffineTransform(); at.tra
我有一组二维点。它们的 X 和 Y 大于 -2 且小于 2。这样的点可以是:(-0.00012 ; 1.2334 )。 我想在图表上显示这些点,使用矩形(矩形表示一个点,并将其坐标设置为其点的坐标 -
我有一张图片,我必须将它旋转 45、90、135、180 度。我在做什么: try { BufferedImage src = ImageIO.read(new File("src.png")
给定 2 java AffineTransform项目,我如何在它们之间进行插值。我需要屏幕上的图像从应用一个矩阵的位置/旋转/缩放缓慢移动到另一个矩阵。 最好这应该相当高效,因为每次游戏抽签时它都会
我有以下内容: public class ParametricEQView extends JPanel implements PluginView { private static fina
我正在尝试使用 AffineTransform 从中心缩放矩形。我确定解决方案很明显,但我无法让它发挥作用!这是我到目前为止测试过的... import java.awt.Color; import
我以前从未使用过 Java 绘图方法,所以我决定深入研究并创建一个模拟时钟作为 PoC。除了指针之外,我还绘制了一个钟面,其中包含分钟/小时的刻度线。我使用简单的 sin/cos 计算来确定圆周线的位
我想将原点从组件的左上角移动到底部中间?我一直在玩 AffineTransform 类无法让它工作? 最佳答案 您将需要要绘制的组件的高度和宽度。假设您在 paint(Graphics g) 方法中,
我正在使用 AffineTransforms 来旋转体积。我现在对旋转角度的符号感到困惑。对于右手系统,当向下看一个轴时,比如 Z 轴,逆时针旋转 XY 平面应该是正角。我定义了一个旋转矩阵 r =
有人有一个示例片段展示如何使用 AffineTransform 缩放字体吗? 谢谢。 最佳答案 嗯,您实际上并不需要 AffineTransform 来执行简单的字体缩放。您可以使用Font.deri
我这里有一个尺寸为 2156x1728 的黑白 png 文件,我想使用 AffineTransform 将其旋转 90 度。生成的图像比例不正确。这里是一些示例代码(假设我已成功将 png 文件加载到
Java 的 AffineTransform 不足以容纳从一个凸四边形到另一个凸四边形的变换吗? 透视变换完全涵盖了凸四边形之间的变换,这是真的吗? 透视矩阵有8个元素,而Java有6个。这是否意味着
这可能更像是一个数学问题,但为什么这个方法会失败? public void test() { AffineTransform transform = AffineTransform.getRo
假设我有一个 AffineTransform (transform) 并调用它的一堆方法。假设我旋转并平移它。然后我用它转换图形对象 (g2d): g2d.transform(transform);
我在使用 Graphics2D 绘图时使用 AffineTransform。我在绘制形状之前用它来变换形状。 rx 和 ry 应该是旋转,但绘制时形状被剪切而不是旋转。如何强制轮换?我尝试使用默认构造
嗨,我是java游戏编程的新手,我正在阅读一些代码,但我无法理解一些事情。我希望这里有人能够帮我解决一些问题。 1)我知道您使用“边界矩形”来检查碰撞。但我的问题是,当您从 graphpics2d/s
我是一名优秀的程序员,十分优秀!