Вопрос

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

public Image rotateImage(Image image, int degrees)

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

ЛВУИТ могу это сделать, и это с открытым исходным кодом.Я предлагаю вам найти код там.

Вы можете попробовать 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);
  }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top