Алгоритм поворота изображения

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

public Image rotateImage(Image image, int degrees)

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

EDIT: я забыл упомянуть, что у меня нет доступных API SVG и что мне нужен метод для поворота на произвольную степень другой чем 90 - 180- 270

кроме того, нет java.ОУ.* пакеты доступны на MIDP 2.0

8 ответов


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

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

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


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

повышение к решению: вращение обычно не дает точных координат пикселей. Сделайте средневзвешенное значение исходного пикселя с его соседями в соответствии с процентом их перекрытия.

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

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

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

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

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


форумы Nokia имеют статью и код на вращение изображений в Java ME


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



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


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


  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);
  }