2009-02-19 6 views
0

Каков наилучший способ вращения буферизованного изображения вокруг его центра, где градиент равен 1 градусу?BufferedImage Rotation

Я знаю, что есть AffineTransform, но это вызывает сдвиг и странные растяжки или черные пятна, которые должны быть пустыми.

редактировать Размеры изображения, которые я имею дело с являются размеры иконок, поэтому, как правило, 24x24 до 48x48 пикселей

ответ

3

Качество вращения для такого небольшого угла будет в значительной степени варьировать в зависимости от размера изображения. Насколько велик ваш образ?

[После того, как ОП редактировал вопрос, чтобы указать размер изображения]

ИМО изображение слишком мало для любого значимого вращения другого, чем в упаковке 90 градусов (при условии, сво квадрата). Я боюсь, что это нужно сделать вручную графическим дизайнером для получения наилучшего качества.

[Другой альтернативой]

Ведите с высоким разрешением версию изображения вокруг. Примените все ваши преобразования к этому изображению, а затем уменьшите масштаб, чтобы получить значок.

+0

обычно от 24x24 до 48x48 пикселей, это очень маленькое изображение –

+0

да, все это маленькое даже изменение в 1 градус никогда не бывает 1 градус. его либо 0, либо 45, не так ли? пиксель либо движется, либо нет. –

+0

А? Конечно, можно повернуть небольшое изображение, это просто означает, что некоторые пиксели будут двигаться, а некоторые - нет. Рассмотрим линию, идущую от (0,0) до (639,0) по сравнению с переходом от (0,0) до (639,1) и т. Д. – unwind

2

Вы пытались установить сглаживание вашего графического контекста?

g2d.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON 
); 
0

Ниже приведены некоторые ссылки, которые объясняют, как вы можете продолжить, применяя преобразования к значкам.

Java 2D Обман: Antialiased Image Превращает http://weblogs.java.net/blog/campbell/archive/2007/03/java_2d_tricker_1.html

субпиксель выборки Растр или DataBuffer в BufferedImage. http://forums.java.net/jive/thread.jspa?messageID=204921&tstart=0

1

Как быстро и грязный исправить, Вы рассмотрели следующий метод: шкала

  • вверх изображение с коэффициентом, например, 8, рисуя его на новый BufferedImage
  • поворота изображение, рисуя его преобразуется в AffineTransform
  • масштаб его обратно вниз, рисуя его на еще один новый BufferedImage

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