![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Масштабирование изображений при просмотре (a-la ACDSee)...
Beat © (2003-07-14 13:43:00)
Наверное все видели как быстро ACDSee масштабирует изображения при просмотре (+ и -). При этом работа ведется с оригинальным изображением, а не создается увеличенная/уменьшенная копия в памяти (судя по Диспетчеру задач и скорости масштабирования).
Логично предположить, что масштабирование ведется прямо на экран (StretchDraw), но скорость при этом очень мала. Следовательно выводится (читай масштабируется) только измененная часть. В принципе размер куска оригинального рисунка определить можно - размер измененной области экрана + Intersect и все это делить на масшаб. Но тогда появляются небольшие глюки глазу не заметные, но при обновлении всего экрана после сдвига по scrollbar"у чувствуешь разницу. Вопрос: КАК делают в ACDSee и аналогах, подскажите плиз, приходится увеличивать во много раз изображение.
Beat (2003-07-16 09:26:00) [1]
Я так и думал (но надеялся на то, что изобрели "вечный двигатель"), жаль... видимо в ACDSee как раз ограничили
>шкалу масштабирования
:(
Но всеже thank, хотя сеи я сделал ранее (просто змечал глюки, прямо скажем НЕ заметные глазом, и хотел пофиксить).
з.ы. отличное - ВРАГ хорошего (но не самый злой) ;)
CyberStorm (2003-07-16 09:07:00) [2]
Гы... 100% точный результат ты получить никак не сможешь адназначна :) т.к. при масштабировании получаются дробные значения которые нельзя без искажений перевести в целые координаты пикселей.
Алгоритм который я использую достаточно прост: есть координаты растра (0,0,1000,1000) и есть координаты окна просмотра этого растра допустим (100,250,300,600) (в системе координат исходного растра) берешь вырезаешь из исходного растра "рабочий" кусок с координатами (100,250,300,600) и с ним работаешь, вычисляешь пропорцию соотношений сторон окна просмотра на экране и "рабочего" куска ну и пользуешься StretchDraw. Чтобы искажения были минимальны прийдется ограничить шкалу масштабирования значениями которые не будет приводить к дробным координатам окна просмотра. По другому - никак :(
Beat (2003-07-16 08:27:00) [3]
Свершилось, меня поняли :)))
Так вот в этом и вопрос: КАК расчитать размер исходного куска изображения который надо Stretch"ить на ClipRect.
Напишите, плиз... (ClipRect.left / Scale и т.д НЕ предлагать, его глюк объяснял во 2 мессаге.
CyberStorm (2003-07-15 21:07:00) [4]
Теперь понял что требуется :)
Делал я подобное для оцифровки карт с больших растров, можешь глянуть. Суть проста: используешь буфер для хранения видимой части картинки т.е. в процессе работы сначала вырезаешь из большого растра видимый кусок изображения (рассчитваяешь его координаты исходя из положения окна просмотра в координатах растра и масштаба просмотра) и уже с него и делаешь вывод StretchDraw, работает достаточно быстро.
Есть пример на http://www.vkasoft.narod.ruоснованный на этом принципе. Откомпилируй демку и загрузи растровую подложку, увидишь скорость скроллинга.
Beat (2003-07-15 12:45:00) [5]
Наверное я плохо объясняю суть вопроса... :(
Я ЗНАЮ про интерполирование, не в этом дело (мне не нужно получать сглаженную, увеличенную копию)...
Поясняю на примере:
Допустим, есть картинка. При просмотре я хочу ее увеличивать, при этом из экономии памяти и скорости работы масштабирую прямо на экран. НО, при сдвиге скролбара в принципе _достаточно_ отрисовать измененную область. КАК мне точно расчитать эту область в исходном изображении (увеличенный_размер / Scale не дает 100% точный результат)???
Или скажем показали окно поверх картинки, убираем его, теперь отрисовываем Canvas->ClipRect (а не всю масштабируем на экран, представьте себе размер картинки 4000 x 4000 и увидите ТАКИЕ тормоза при StretchDraw всей картинки, поэтому по идее юзать надо StretchBlt где передавать координаты _измененного_ не увеличенного куска изображения и ClipRect в качестве параметров).
ЛЮДИ, помогите (посмотрите как БЫСТРО ACDSee выводите отмасштабированное изображение при скролировании и т.д.)!
CyberStorm (2003-07-15 12:18:00) [6]
Jeerтебе правильно сказал - используй интерполяцию. Дублирование позникает из за того что при получении координат пикселя в исходном изображении получаются дробные значения и в этом случае примитивные алгоритмы или округляют или отбрасывают дробную часть поэтому и получается дублирование. Для более качественной обработки нужно обрабатывать соседние пиксели и интерполировать цвет пикселей вашего увеличенного пикселя. Т.е. допустим после масштабирования размер увеличенного пикселя равен 3х3 пикселя вот и расчитывайте цвета этих составляющих пикселей с учетом окружающих пикселей исходного изображения.
Beat (2003-07-15 09:52:00) [7]
Да я не о "квадратиках" в результате масштабирования, а о том, что при масштабировании некоторые пикселид дублируются 2 раза, другие 3 (в зависимости от пропорции исходного изображения к результирующему). Поэтому точно определить НЕ получается (NewWidth/Scale не дает нужные координаты в исходном изображении - читай куска) координаты обновляемой части изображения. Надеюсь понятно объясняю. Единственное, что остается, так это по алгоритму масштабирования доходить до нужной точки - но это гемор.
Помогите, кто знает...
Jeer (2003-07-14 15:23:00) [8]
Методы интерполяции тебе помогут.
Другое дело, как они будут принципиально реализованы.
От этого зависит быстродействие.