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