Алгоритм вращения изображения
Я ищу алгоритм, который поворачивает изображение на несколько градусов (ввод).
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
Ответы
Ответ 1
Одна из лучших страниц, описывающих алгоритмы вращения изображений, которые я нашел в Интернете, связана с превосходной библиотекой лептоники Дэна Блумберга. Хотя сама библиотека leptonica написана на C и вам не поможет, его страница посвящена алгоритмам поворота изображений:
http://www.leptonica.org/rotation.html
безусловно, стоит прочитать. Скорее всего, вы захотите реализовать что-то вроде алгоритма поворота по области, который он описывает во второй части страницы.
Ответ 2
Общее решение:. Для каждого пикселя на целевом изображении возьмите пиксель в исходном изображении с координатами целевого пикселя, повернутым в противоположном направлении.
Усиление решения: Вращение обычно не дает точных координат пикселей. Сделайте средневзвешенное значение исходного пикселя со своими соседями в соответствии с процентом, который он накладывает на них.
Быстрое решение для двоичных изображений: Преобразование изображения в "прогоны" последовательных пикселей переднего плана. Затем поверните конечные точки этих линий и вставьте их в пункт назначения.
Обычно это приводит к небольшим разрывам из-за целочисленного округления, поэтому, когда одна или обе конечные точки более чем на 10% удаляются от целого числа, патч рисует две строки для отдельной строки источника, используя округленные и округленные целые координаты.
Если одна конечная точка находится в пределах 10%, а другая - нет, две линии образуют форму "V". Если оба параметра отключены более чем на 10%, две линии образуют форму "X".
Это можно сделать относительно оси X или оси Y. Используйте ту, которая имеет наименьший угол между осью и углом поворота. (I.e, если угол поворота находится между 45 и -45, используйте ось X.)
Еще более быстрое решение для двоичных изображений: Если пикселей меньше пикселов, чем пикселов переднего плана, заполните назначение переднего плана и следуйте приведенному выше алгоритму с помощью фоновых пикселей.
Ответ 3
На форумах Nokia есть статья и код на Поворот изображений в Java ME
Ответ 4
LWUIT может это сделать, и это open source. Я предлагаю вам найти там код.
Ответ 5
Начало работы с мобильной 2D-графикой для J2ME: http://developers.sun.com/mobility/midp/articles/s2dvg/index.html
http://j2mepolish.org/javadoc/j2me/de/enough/polish/util/ImageUtil.html
Ответ 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);
}