Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Масштабирование изображений при просмотре (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 вся ветка

Форум: "Media";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.03 c
11-41120
microlab
2003-02-16 20:20
2003.11.13
Нашёл необычное решение для создания ярлыков


1-41193
sagchat
2003-11-02 12:37
2003.11.13
не роботает под XP


14-41940
fool
2003-10-20 17:08
2003.11.13
MSSQL 7.0: непонятные тормоза


9-40766
Rooo
2003-05-11 15:29
2003.11.13
OpenGL 3D Engine


3-41100
viktor
2003-10-23 02:18
2003.11.13
Использование TreeView c базой даных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский