![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм качественного уменьшения рисунка [D7, Win95/98, WinXP]
sco © (2006-02-10 16:08:00)Извините за банальный вопрос, который где только не рассматривался, но мой "треугольный мозг, - как выражается одна моя знакомая - это не понял". Перепробовал 3 алгоритма, из них 2 не отладил, а 1 заработал, вот только слово "качественный" к нему никак не подходит. А мне то нужно чтобы в Image загрузить рисунок 1280-960(это в среднем) и "КРАСИВО" отмаштабировать в допустимые формой размеры(при разных разрешениях разные размеры). Грузит вроде нормально но вот маштабирует плохо, у меня слайдшоу картин, и мне естественно очень важно "красиво" показывать рисунки. А то шикарные картины просто теряют вид.
В яндексе я всё проискал, что нашёл либо не подошло, либо не заработало. Гугл не для меня, проблемы с английским. Где ещё искать не знаю. Мож у кого-нидь есть ссылки,алгоритмы,функции?
Fenik (2006-02-12 02:17:00) [1]http://torry.net/vcl/graphics/bitmap/resample.zip
vrem (2006-02-11 21:33:00) [2]1. прямое преобразование фурье(можно быстрое)
2. отбрасывание "лишних" частот
3. обратное преобразование фурье(тоже можно быстрое)
пример -
есть 1024 точки. надо 512 точек
делаем прямое быстрое преобразование фурье(т.к. 1024 это степень двойки) - получается разложение на 512 частот. половину частот(высоких) выбрасываем, остаётся 256 низких частот.
делаем обратное быстрое преобразование фурье, получаем 512 точек как и требуется
antonn (2006-02-11 20:53:00) [3]misha_gr (11.02.06 20:14) [3]
Непосредственно в лоб решать таким образом задачку нельзя
нужно с DIB данными работать непосредственно:)
misha_gr (2006-02-11 20:14:00) [4]Только что реализовал... при преобразовании картинки 517*600
к 862*1000 результирующая матрица превышает 2GB, соответственно, память под такой массифчик не выделяется. Непосредственно в лоб решать таким образом задачку нельзя. Но в общем, идея понятна. Как реализую - отпишу )))
misha_gr (2006-02-11 17:58:00) [5]О, только сегодня подсказали ))) Цитирую:
TImage.Picture.Graphic конвертируем в TBitmap (думаю сам догадаешься).
Далее, битмап представляет собой двумерный массив
значений цветов, типа rgb[x1][y1] чтоб ресайзнуть его до rgb[x2][y2] надо сделать промежуточную матрицу rgb[XNOK][YNOK] XNOK YNOK - наименьшие общие кратные x1, x2 и y1,y2 соотв.
Далее практически очевидно - идет ресемплирование конечного пикселя по маленьким кусочкам этой большой матрицы.
Пример приведу, матрица 10 на 10 чтоб сделать из нее 7 на 7, делается матрица 70 на 70, в которой один оригинальный пиксель = это кусочек 7 на 7. а потом из 70х70 последовательно берутся кусочки 10х10, выссчитывются их средние значения цветов, и получается в конце пересчитанная 7х7.
Если влом считать нок - можно тупо перемножать, но можно потерть в памяти места раз в 4-16.
Jeer (2006-02-10 16:50:00) [6]В таком случае имеет смысл поискать готовое:
-FastLib