| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Масштабирование изображения |
| Автор: Dmi-Afonin 31.10.2004, 13:12 | ||
| Народ у меня такая проблема: в FAQ нашел текст программы масштабирования изображения с помощью интерполяции, но там написано что данный алгоритм подходит только для увеличения изображения! Но это не совсем так, если коэффициенты dx и dy задать меньше 1, то алгоритм будет уменьшать изображение, но при dx и dy меньше 0.5 он работает корректно, а при dx и dy в пределах от 0.5 до 1 кое-где появляются пиксели "левого" цвета! Посьба у меня такая, подскажите пожалуйста как переделать алгоритм чтобы он работал корректно при любых dx и dy, а если это невозможно то подскажите другой гибкий алгоритм по уменьшению изображения!(Только без испрользования Stretch, или объединения по 4 пикселя) Вот текст алгоритма:
|
| Автор: Zero 31.10.2004, 13:25 |
| Dmi-Afonin, ты читал правила форума??? Там было такое: "Нельзя задавать один и тот-же вопрос на двух сайтах" На сколько мне помнится то по этому адресу: http://forum.sources.ru/index.php?showtopic=70506, у тебя уже есть вопрос. |
| Автор: maxim1000 31.10.2004, 14:03 | ||
| обычно делают так: предполагают, что коэффициент - рациональное число (а других в компьютерах, обычно, и не бывает растягивают изображение в n раз, а потом сжимают в m а вот для растяжения и сжатия есть уже два варианта: 1. пользоваться только теми пикселами, которые уже есть 2. вычислять значения новых пикселов по какому-то алгоритму второй вариант может (и чаще всего) приводит к появлению пикселов "левых" цветов, хотя обычно их цвет находится где-то между цветами соседних (при сжатии можно заменять средним цветом, при растяжении - интерполировать), такой алгоритм может немного сгладить резкие переходы (что не всегда хорошо, например, для компьютерной графики типа всяких диаграмм, текстов) первый вариант просто копирует пиксели нужное количество раз при растяжении и прореживает рисунок при сжатии, новых значений пикселов не появляется, но при этом плавные переходы могут немного испортиться (это не очень хорошо проявит себя на естественных изображениях) --- на самом деле если не требуется очень высокое качество, лучше выбрать второй алгоритм, т.к. он проще. а алгоритм простой (к примеру k=0.7) 1. представляем коэффициент в виде 7/10 2. растягиваем рисунок в 10 раз (копируем каждый пиксель 100 раз) 3. сжимаем в 7 раз - берем каждый 7-ой пиксель по горизонтали и по вертикали если рисунки маленькие или памяти куча, на этом можно остановиться если нет, можно немного соптимизировать: проводить сжатие и растяжение одновременно: например, для строки:
что-то в этом роде... не проверял... original - строка исходного изображения result - строка, куда будет записан результат m,n - представление k в виде дроби (если разложить на целые, быстрее будет) width - длина строки |
| Автор: Illusion Dolphin 31.10.2004, 14:29 | ||||
Dmi-Afonin: у меня была та же проблема, но я её решил, вот исходник конечного результата:
Width, Height - ширина и высота исходного куска из S с начальной точкой в (х,у), Rect - кусок, куда он будет преобразован в D.
А как же скорость работы???? зачем стягивать и растягивать, если можно сразу сделать необходимое действие... Тем более тут используется не линейное преобразование, а это: "result[c]:=original[c*n/m];" - вроде как простое линейное преобразование... |
| Автор: Dmi-Afonin 31.10.2004, 15:08 |
| Удалено модератором... Высказывайся по-культурнее... На том сайте мне ничего не подсказали толкового. А остальным больше спосибо, сейчас буду пробовать. |
| Автор: Dmi-Afonin 31.10.2004, 15:27 |
| Illusion Dolphin будь другом напиши пожалуйста, что за идентификатор Math, и как задавать Rect или скинь на мыло полный исходник [email protected]. Заранее благодарен!!! |
| Автор: Illusion Dolphin 31.10.2004, 16:43 | ||||
это точное указание модуля, откуда брать эту функцию.
Rect задаётся очень просто: Rect(x1,y1,x2,x2), где (x1,y1) - начальная точка, (x2,y2) - конечная точка. P.S. А ругаться не нужно, это тоже записано в правилах форума |
| Автор: Dmi-Afonin 31.10.2004, 16:45 |
| Illusion Dolphin огромное спасибо сейчас попробую! |
| Автор: Dmi-Afonin 31.10.2004, 18:43 | ||
Illusion Dolphin Что то у меня никак не получается вот исходный текст посмотри пожалуйста, что не так!!!
|
| Автор: Illusion Dolphin 31.10.2004, 19:15 | ||||
Вот пример использования:
P.S. я наверное неправильно сказал параметры - первые параметры это куда это спроецировать на D то, что находится в Rect S. Добавлено @ 19:19 ты ещё спрашивал как сделать это рабочим при любых коэффициентах... то, что я дал - это только для увеличения, для уменьшения юзай эту, параметры у енё точно те же (для совместимости)
|
| Автор: Dmi-Afonin 31.10.2004, 19:36 |
| Еще раз спасибо тебе Illusion Dolphin ты мне очень помог. |
| Автор: Dmi-Afonin 1.11.2004, 03:36 |
| Ура народ у меня всё получилось!!! Всем огромное спасибо, особенно Illusion Dolphin. Ты меня очень выручил. |