Итак, я скачал вы «оригинальный» образ (который не является квадратом), модифицировали его так было квадратным, запустить свой код, получил java.awt.image.ImagingOpException: Unable to transform src image
исключение, изменилось BufferedImage.TYPE_INT_RGB
в BufferedImage.TYPE_INT_ARGB
и получил ...
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
try {
BufferedImage img = ImageIO.read(Main.class.getResource("/Block.jpg"));
BufferedImage rotate = rotate(img.getHeight(), img.getWidth(), img, 90);
JPanel panel = new JPanel();
panel.add(new JLabel(new ImageIcon(img)));
panel.add(new JLabel(new ImageIcon(rotate)));
JOptionPane.showMessageDialog(null, panel);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static BufferedImage rotate(int height, int width, BufferedImage originalImg, int angle) {
BufferedImage rotateImage = null;
try {
rotateImage = new BufferedImage(height, width, BufferedImage.TYPE_INT_ARGB);
AffineTransform a90 = AffineTransform.getRotateInstance(Math.toRadians(angle), height/2, width/2);
AffineTransformOp op90 = new AffineTransformOp(a90, AffineTransformOp.TYPE_BILINEAR);
op90.filter(originalImg, rotateImage);
} catch (Exception e) {
e.printStackTrace();
}
return rotateImage;
}
}
Мои, "кишка" чувство также изменить метод rotate
, как это не нужно width
и height
значения;
public static BufferedImage rotate(BufferedImage originalImg, int angle) {
BufferedImage rotateImage = null;
try {
rotateImage = new BufferedImage(originalImg.getWidth(), originalImg.getHeight(), BufferedImage.TYPE_INT_ARGB);
AffineTransform a90 = AffineTransform.getRotateInstance(Math.toRadians(angle), originalImg.getWidth()/2, originalImg.getHeight()/2);
AffineTransformOp op90 = new AffineTransformOp(a90, AffineTransformOp.TYPE_BILINEAR);
op90.filter(originalImg, rotateImage);
} catch (Exception e) {
e.printStackTrace();
}
return rotateImage;
}
необходимо использовать размеры оригинального изображения напрямую. Это позволит выявить возможные ошибки в ваших изображениях. Это также предполагает, что вы хотите только поворачивать изображение с шагом в 90 градусов.
Все API-интерфейсы, которые принимают ширину и высоту, будут иметь аргумент width перед аргументом высоты. Я не уверен, что вы переключили их намеренно. Независимо от того, конструктор BufferedImage ожидает ширину, за которой следует высота, а метод AffineTransform.getRotateInstance ожидает координату X, за которой следует координата Y. – VGR
Ну, мои изображения все квадратные, поэтому он не сильно меняется, и getRotateInstance нуждается в якоре для поворота вокруг, поэтому я отправил середину моего изображения с высотой/2 и шириной/2 – Kariamoss
Это касается меня: 'BufferedImage.TYPE_INT_RGB'. Разве это не должно быть 'BufferedImage.TYPE_INT_ARGB'? У вас есть прозрачность, то есть вам нужна альфа. –