java实现PNG图片任意角度旋转
代码如下,使用时直接调用rotate方法即可,旋转后的图片会覆盖原图片,angel为旋转的角度,支持任意旋转角度。
虽然我不懂,但我大受震撼;
private void rotate(File file, int angel) throws IOException {
Image image = ImageIO.read(file);
int width = image.getWidth(null);
int height = image.getHeight(null);
Rectangle rect = calcRotatedSize(new Rectangle(new Dimension(width, height)), angel);
//因为我需要旋转的是png格式的透明背景图片,所以需要使用TYPE_INT_ARGB.
BufferedImage bi = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
// 进行转换
g.translate((rect.width - width) / 2, (rect.height - height) / 2);
g.rotate(Math.toRadians(angel), width / 2, height / 2);
g.drawImage(image, 0, 0, null);
ImageIO.write(bi, "PNG", file);
}
private Rectangle calcRotatedSize(Rectangle rectangle, int angel) {
if (angel >= 90) {
if (angel / 90 % 2 == 1) {
int temp = rectangle.height;
rectangle.height = rectangle.width;
rectangle.width = temp;
}
angel = angel % 90;
}
double r = Math.sqrt(rectangle.height * rectangle.height + rectangle.width * rectangle.width) / 2;
double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
double angelAlpha = (Math.PI - Math.toRadians(angel)) / 2;
double angelDaltaWidth = Math.atan((double) rectangle.height / rectangle.width);
double angelDaltaHeight = Math.atan((double) rectangle.width / rectangle.height);
int lenDaltaWidth = (int) (len * Math.cos(Math.PI - angelAlpha - angelDaltaWidth));
int lenDaltaHeight = (int) (len * Math.cos(Math.PI - angelAlpha - angelDaltaHeight));
int desWith = rectangle.width + lenDaltaWidth * 2;
int desHeight = rectangle.height + lenDaltaHeight * 2;
return new Rectangle(new Dimension(desWith, desHeight));
}
旋转效果:
原图
旋转270度之后: