Как получить Изображение поворота AfineTransform в Java - PullRequest
0 голосов
/ 17 апреля 2019

Я могу повернуть изображение.Это прекрасно работает.Однако я хочу иметь возможность экстрагировать форму / полигон полученного изображения, чтобы я мог использовать его для захвата события мыши, когда мышь перемещается по повернутому изображению.

Это мой код:

private Shape imageShape;

private Image rotateFilter(Image img, int degrees) {
    BufferedImage sourceImage = (BufferedImage)img;

    double radians = Math.toRadians(degrees);
    double cos = Math.abs(Math.cos(radians));
    double sin = Math.abs(Math.sin(radians));

    int width = sourceImage.getWidth();
    int height = sourceImage.getHeight();

    int w = (int) Math.floor(width * cos + height * sin);
    int h = (int) Math.floor(width * sin + height * cos);

    int x = (w - width) / 2;
    int y = (h - height) / 2;

    BufferedImage destImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);        
    Graphics2D g2d = destImage.createGraphics();

    AffineTransform at = new AffineTransform();
    at.rotate(radians, x + (width / 2), y + (height / 2));
    at.translate(x, y);

каким-то образом получить форму / полигон здесь (imageShape) g2d.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);g2d.drawRenderedImage (sourceImage, at);g2d.dispose ();вернуть destImage;}

public void mouseEntered(MouseEvent e) {
    int mx = e.getX();
    int my = e.getY();
    return imageShape.contains(mx, my);
}

Ответы [ 3 ]

0 голосов
/ 20 апреля 2019

Есть разные способы сделать это - кроме предложенной вами прямой математики, которую вы должны применить и к матрице преобразования, чтобы быть на одной стороне:

a) используйте точки и преобразуйте их:

    AffineTransform at=AffineTransform.getRotateInstance(....);
    Point p=new Point(x, y);
    at.transform(p, p);

Это преобразует точку p и сохранит результат в себе, поэтому p изменится - вы можете использовать другую точку для хранения новых координат.

Применитесь к четырем точкам, затем создайте многоугольник

Polygon pl=new Polygon();
for(i=0; i<points.length; i+++) pl.addPoint(points[i].x, points[i].y);

Полигон имеет метод contains ().

б) создать полигон (или прямоугольник) из исходного изображения

Polygon pl=new Polygon();
pl.addPoint(0, 0);
pl.addPoint(im.getWidth()-1, 0);
pl.addPoint(im.getWidth()-1, im.getHeight()-1);
pl.addPoint(0, im.getHeight()-1);

или

Rectangle r=new Rectangle(0, 0, im.getWidth(), im.getHeight());

Тогда используйте

  AffineTransform at=new AffineTransform(.....);
  Shape sh=at.createTransformedShape(pl);

и имейте sh как новую форму. Эта вещь не всегда работает точно (я имею в виду все это с формами, границами и т. Д.), Но удобна, если вы ищете это.

0 голосов
/ 24 апреля 2019

Да, я использовал ваш вариант Б почти точно.Я сделал так, чтобы хранить два прямоугольника.Один для хранения x, y, w, h повернутого / преобразованного изображения, а другой для хранения набора исходного изображения x, y, w, h.Последний прямоугольник не изменяется (по крайней мере, пока я не увеличу масштаб, в этом случае этот прямоугольник обновляется).Так как последнее не меняется, я использую это, чтобы сохранить ноту «реального» прямоугольника изображения, а не преобразованного.Итак, что я делаю, мы аффинно преобразуем изображение, затем строим многоугольник в точности так, как вы предлагаете, и затем используете createTrasformedShape, чтобы получить форму.Так что пятно на ногте.Это работает очень хорошо.Немного медленно, но удивительно точно.Спасибо.

0 голосов
/ 20 апреля 2019

Да, к сожалению, нет простого пути. Если вы поворачиваете изображение, вы все равно получаете прямоугольник с повернутым на него изображением. Единственный способ, которым я смог обойти это, - это управлять 4-мя углами, используя математику, но, конечно, математика никогда не будет точно такой же, как вращение AffineTransform.

То, что я хочу сделать, это повернуть изображение и применить к нему форму, чтобы я мог использовать функцию has () с помощью мыши x / y. Я хочу, чтобы мышь получала события только тогда, когда мышь находится над изображением, даже если оно повернуто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...