Алгоритм поворота изображения - PullRequest
19 голосов
/ 27 января 2009

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

public Image rotateImage(Image image, int degrees)

(экземпляры изображения могут быть заменены на int [], содержащее значения RGB каждого пикселя, Моя проблема в том, что мне нужно реализовать его для проекта JavaME MIDP 2.0, поэтому я должен использовать код, работающий на JVM до версии 1.5 Кто-нибудь может мне помочь с этим?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что у меня нет доступных API SVG и что мне нужен метод для поворота на произвольную степень, отличную от 90 - 180 - 270

Кроме того, в MIDP 2.0

нет пакетов java.awt. *

Ответы [ 8 ]

22 голосов
/ 27 января 2009

Одна из лучших страниц, описывающих алгоритмы поворота изображений, которые я нашел в Интернете, связана с библиотекой превосходной лептоники Дэна Блумберга. Хотя сама библиотека leptonica написана на C и не поможет вам, его страница об алгоритмах вращения изображений:

http://www.leptonica.org/rotation.html

определенно стоит прочитать. Скорее всего, вы захотите реализовать что-то вроде алгоритма поворота по области, который он описывает во второй части страницы.

7 голосов
/ 25 февраля 2009

Общее решение: Для каждого пикселя в целевом изображении возьмите пиксель в исходном изображении с координатами целевого пикселя, повернутыми в противоположном направлении.

Улучшение решения: Вращение обычно не дает точных координат пикселей. Получите средневзвешенное значение исходного пикселя с его соседями в соответствии с процентом, в котором он перекрывает их.

Ускоренное решение для двоичных изображений: Преобразование изображения в «серии» последовательных пикселей переднего плана. Затем поверните конечные точки этих линий и нарисуйте их в пункте назначения.

Обычно это приводит к небольшим промежуткам из-за округления целых чисел, поэтому, когда одна или обе конечные точки находятся на расстоянии более 10% от целого числа, исправьте путем рисования ДВУХ линий для одиночной исходной строки, используя целочисленные координаты, округленные вверх и вниз.

Если одна конечная точка находится в пределах 10%, а другая - нет, две линии образуют V-образную форму. Если оба значения отклонены более чем на 10%, две линии образуют форму «X».

Это можно сделать относительно оси X или оси Y. Используйте тот, у которого наименьший угол между осью и углом поворота. (То есть, если угол поворота находится между 45 и -45, используйте ось X.)

Еще более быстрое решение для двоичных изображений: Если фоновых пикселей меньше, чем пикселей переднего плана, заполните место назначения передним планом и следуйте приведенному выше алгоритму с фоновыми пикселями.

3 голосов
/ 27 января 2009

На форумах Nokia есть статья и код Вращение изображений в Java ME

1 голос
/ 28 января 2009

LWUIT может сделать это, и это с открытым исходным кодом. Я предлагаю вам найти код там.

0 голосов
/ 15 мая 2010
  public Image rotateImage(Image img, float degrees){
   BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB);
   sourceBI.getGraphics().drawImage(img,0,0,null);
   AffineTransform at = new AffineTransform();
   at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2);
   BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
   return bio.filter(sourceBI, null);
  }
0 голосов
/ 29 июня 2009

Вы можете попробовать http://www.j2mearmyknife.com/. Он имеет много интересных визуальных эффектов, включая вращение изображения.

0 голосов
/ 27 января 2009
0 голосов
/ 27 января 2009

Graphics2D и AffineTransform помогут вам сделать именно то, что вы хотите. В частности, Graphics2D.drawImage (Image, AffineTransform) и AffineTransform.getRotateInstance. Вы также можете делать масштабирование, перевод и сдвиг с этим. Оба класса находились в среде выполнения начиная с версии 1.4, возможно, раньше.

...