Алгоритм поворота изображения
Я ищу алгоритм, который поворачивает изображение на несколько градусов (на входе).
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.)
еще более быстрое решение для двоичных изображений: Если фоновых пикселей меньше, чем пикселей переднего плана, заполните пункт назначения передним планом и следуйте приведенному выше алгоритм с фоновыми пикселями.
начало работы с мобильной 2D-графикой для J2ME:http://developers.sun.com/mobility/midp/articles/s2dvg/index.html
http://j2mepolish.org/javadoc/j2me/de/enough/polish/util/ImageUtil.html
вы можете попробовать 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);
}