AffineTransform truncates image
我有一个图像,必须将其旋转45、90、135、180度。我在做什么:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | try { BufferedImage src = ImageIO.read(new File("src.png")); double ang = Math.toRadians(90); AffineTransform t = new AffineTransform(); t.setToRotation(ang, src.getWidth() / 2, src.getHeight() / 2); AffineTransformOp op = new AffineTransformOp(t, null); BufferedImage dst = new BufferedImage(src.getWidth(), src.getHeight(), src.getType()); op.filter(src, dst); ImageIO.write(dst,"png", new File("output.png")); } catch(Exception ex) { ex.printStackTrace(); } |
问题是图像改变了位置并超出了目标图像的范围:
我已经对此进行了搜索,并找到了以下问题的解决方案:AffineTransform会截断图像,我该怎么办?但是我完全不理解,它仅适用于象限。我尝试将目标的宽度和高度乘以两倍,但失败了:
该如何解决?目标图像不应有任何多余的(对角线旋转除外)空白或截断的区域。angular问题(0 == 180或顺时针方向)并不重要。
感谢您的帮助。
编辑:现在,它适用于一般情况。
围绕中心进行旋转,并将中心放置在目标图像中与源图像中相同的位置(正确行为)。
我已经修改了您的代码以转换源图像矩形,以便我们可以轻松获得新的尺寸/图像偏移。这用于构造尺寸正确的目标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | BufferedImage src = ImageIO.read(new File(INPUT)); int w = src.getWidth(); int h = src.getHeight(); AffineTransform t = new AffineTransform(); double ang = Math.toRadians(35); t.setToRotation(ang, w / 2d, h / 2d); // source image rectangle Point[] points = { new Point(0, 0), new Point(w, 0), new Point(w, h), new Point(0, h) }; // transform to destination rectangle t.transform(points, 0, points, 0, 4); // get destination rectangle bounding box Point min = new Point(points[0]); Point max = new Point(points[0]); for (int i = 1, n = points.length; i < n; i ++) { Point p = points[i]; double pX = p.getX(), pY = p.getY(); // update min/max x if (pX < min.getX()) min.setLocation(pX, min.getY()); if (pX > max.getX()) max.setLocation(pX, max.getY()); // update min/max y if (pY < min.getY()) min.setLocation(min.getX(), pY); if (pY > max.getY()) max.setLocation(max.getX(), pY); } // determine new width, height w = (int) (max.getX() - min.getX()); h = (int) (max.getY() - min.getY()); // determine required translation double tx = min.getX(); double ty = min.getY(); // append required translation AffineTransform translation = new AffineTransform(); translation.translate(-tx, -ty); t.preConcatenate(translation); AffineTransformOp op = new AffineTransformOp(t, null); BufferedImage dst = new BufferedImage(w, h, src.getType()); op.filter(src, dst); ImageIO.write(dst,"png", new File(OUTPUT)); |
我建议替换
1 |
with
1 |
它将大大提高输出质量。