![]() |
|
|
![]()
|
|
| Deniskkk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Кто может помочь информацией?
Требуется: 1 картинку в BMP крутить на угол Alpha относительно центра 2 изменять её размер в N (от 0 до 10 поримерно) раз Собираюсь програмировать это на Jave . На скока понимаю без интерполяции не обойтись. |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Чтоооо
А накой тут интерполяция?! Интерполяция- это получение функции по заданным значениям нескольких точек на отрезке.(Примитивное объяснение). И зачем она в повороте/уменьшении картинки?! -------------------- Всем добра |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
когда картинка поворачивается, пикселы повёрнутой не всегда (а точнее, почти никогда) совпадают с пикселами исходной т.е. для того, чтобы узнать цвет, например, пиксела (13,10) повёрнутой картинки, нужно узнать цвет исходной (опять же например) в (10.5,11.5), а это уже вполне обычная задача интерполяции с масштабированием ситуация похожая... в принципе в голову приходят такие мысли: 1. выбирать ближайший пиксель (по сути, округлять) 2. брать усреднённое значение соседних символов 3. вообще построить какую-то модель изображения (например, взять его Фурье-образ, а потом исходя из него получать значения в промежутках, или перевести его в векторный вид, там повернуть и вернуть в растр) если используются какие-то специфические изображения, можно попробовать использовать их свойства: например, если мы знаем, что изображение всегда будет состоять из кружочков разного размера, то можно распознать все кружочки, пересчитать их центры после поворота и нарисовать их Добавлено @ 21:55 в общем, всё зависит от требуемого качества поворота если требования не очень жёсткие, то можно останоситься, например, на выборе ближайшего пиксела, как самом простом кстати, есть ещё один алгоритм поворота - последовательность трёх скашиваний: одно в вертикальном направлении, второе - в горизонтальном, третье - опять в вертикальном у него тоже есть преимущества - мало арифметики, что может увеличить скорость (правда, не мерял) скашивание сводится к одной операции с вещественными числами (да и ту можно на целые переделать), а дальше - просто сдвинуть кусок памяти кроме того, этот метод обладает ещё двумя хорошими свойствами: 1. если повернуть на какой-то угол в одну сторону, а потом на него же в другую - получим то же самое изображение, при использовании большинства других методов картинка будет размазываться (правда, если повернуть два раза в одну сторону на 10 градусов, а потом в другую на 20, то уже и этот алгоритм не даст исходного изображения) 2. он только переставляет пикселы, т.е.: --- никаких новых цветов на изображении не появляется, т.е. на чёрно-белом не появится серого --- распределение тоже не меняется, т.е. сколько было пикселей (123,60,200), столько же их и останется (конечно, за исключением тех, которые выйдут за границу) такие свойства тоже иногда могут пригодиться... -------------------- qqq |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
А если пиксели поворачивать синусом/косинусом
-------------------- Всем добра |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
maxim1000, круто парня загрузил... Приведу код из книги "DirectX. Графика в проектах Delphi" М. Краснова (понятно, что код на делфи, однако напишу коментарии):
Добавлено @ 23:43 Забыл сказать, что перед поворотом (32-я строка в листиге), необходимо заполнить массив Pict из BitMap'a. А после вызова функции, заполнить BitMap из массива. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
тогда координаты получатся нецелые и возникает вопрос, куда их записывать -------------------- qqq |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
||||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: нет Всего: 181 |
Если нужно качественно и не сильно медленно, можно взять например cubic b-spline алгоритм, описание и имплементацию см. в google или www.koders.com
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
в принципе, при "чистом" повороте(без масштабирования) можно вести маску - хранить список "заполненных" ячеек, чтоб не получилось, будто мы в одно место переместили две точки, а в другую - ни одной. тогда можно - либо округлять нецелые координаты, либо отбрасывать дробную часть. ещё можно пройтись дважды: один раз отбрасывая дробную часть у нецелых координат, второй раз - обрасывая дробную часть и прибавляя единицу. ясен пень, что теоретически точки могут поменять взаимное расположение, но это можно проконтролировать дополнительно. в некоторых случаях такой метод будет намного быстрее интерполяции для всех точек.
|
|||
|
||||
| Deniskkk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Спасибо за стоко ответов.
Писал - писал и всё не засейвилось. А ещё я на русском плохо печатаю. Так что в крацце постараюсь ответить на свой вопрос... В алгоритме описанном Bitter если считать в обратную сторону (искать цвет для каждого нового пикселя) и вместо truncate брать дробные результаты и смешивать близлежащие пиксели в определённом отношении. Мои мысли: Я было подумал по площади... но как её посчитать? Или может по функции какой? Если есть у кого мысли на эту тему поделитесь. Желательно чтоб формулы были попроще (ну всмысле чтоб для этого дифы не пришлось решать =] ) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Deniskkk, самая простая интерполяция - билинейная (по 4 ближайшим пикселам). Однако она слегка размывает изображение. Формулы вот:
Использованные типы данных, надеюсь, прозрачны. Кубическая интерполяция чуть сложнее (но никаких диффуров) и дольше работает, но результаты лучше. Надо? -------------------- ... |
|||
|
||||
| Deniskkk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
спасибо. Удовлетворён =]
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |