Подтвердить что ты не робот

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

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

public Image rotateImage(Image image, int degrees)

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 4

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

Ответ 6

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

Ответ 7

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

Ответ 8

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