|
Модераторы: Snowy, Alexeis, MetalFan |
|
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Наконец-то я выкладываю новую версию своей библиотеки компонентов.
Что нового в этой версии? 1. Добавлен компонент TTexturePanel. 2. В TCustomScrollingImage добавлено масштабирование, а также автоматическое масштабирование по размеру компонента. 3. Изменена иерархия компонентов для скроллинга, теперь TFastScrollingImage наследуется от TScrollingImage. 4. Наследники TCustomScrollingImage, а также компоненты TBitmapContainer и TBitmapPanel теперь имеют свойство Transparent, позволяющее делать компонент прозрачным. 5. Добавлена возможность нестандартной отрисовки изображения в компонентах для скроллинга. 6. Добавлено изменение курсоров для скроллинга в design-time с помощью свойств ImageCanScrollCursor, ImageDragCursor, ImageScrollDisabled. 7. В TCustomScrollingImage добавлены свойства RealImagePos, RealImageLeft, RealImageTop, по которым можно узнать настоящие координаты изображения в компоненте, учитывая то, что оно может неполностью заполнять компонент. 8. Добавлено в TCustomScrollingImage свойство CanScrollWithMouse, позволяющее запретить скроллинг с помощью мыши. 9. Исправлен глюк в навигаторе при щелчке в нем правой кнопкой мыши. 10. В модуль ImgCtrlUtils добавлена процедура LoadGraphicToBitmap и немного подправлена функция IsEmptyPicture. 11. Добавлен модуль ImgCtrlsSkins. 12. Устранены другие небольшие баги и ошибки. Жду ваших пожеланий и оценок! Версия 2.1.1: Это сообщение отредактировал(а) Snowy - 4.12.2006, 14:17 Присоединённый файл ( Кол-во скачиваний: 395 ) ImgCtrls211.zip 160,46 Kb |
|||
|
||||
Illusion Dolphin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 13 Всего: 63 |
Из первых впечатлений:
1) ScrollingImage FitImage -> Abstract Error или деление на ноль ( function TCustomScrollingImage.GetFitImageScale: Extended; begin Result := Min(ClientWidth / FPicture.Width, ClientHeight / FPicture.Height); //тутя бы проверил FPicture на не nil и FPicture.Height и FPicture.Width на не о end; ) 2) Я бы добавил события на скрол мыши, если их нет (я не заметил) события на скрол мыши 3) ScrollingImageNavigator1 - чтобы можно было правой кнопкой задавать размер области - было бы очень неплохо -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
1) Ой, сенкс, не заметил.
2) Насчет этого события у меня есть сомнения. Его сделать несложно, но оно будет работать только тогда, когда компонент будет иметь фокус. Но удобно ли это? В демке я сделал возможность скроллинга колесом мыши, когда курсор находится над компонентом. Мне кажется, что это удобнее, а делается не так уж сложно. В хелпе об этом даже написал. Но если я неправ, то прошу меня поправить. 3) Работаем! Версия ведь не последняя. Но насчет правой клавиши не уверен, потому что может понадобиться сделать контекстное меню. Так что думаю сделать просто метод, который будет вызывать зум в навигаторе. А вызывать этот метод можно будет по событиям от мыши в рантайм. Это сообщение отредактировал(а) s-mike - 19.3.2005, 20:11 |
|||
|
||||
offline |
|
|||
Опытный Профиль Группа: Участник Сообщений: 474 Регистрация: 7.2.2005 Репутация: нет Всего: 7 |
Компоненты хорошие. Особенно удивило, что при масштабировании изображения, границы изображения сглаживаются, а не остаются в зазубринах как в стандартном TImage. Но, сглаживание происходит не полностью. Возможно что, то нужно дополнительно выставить, но я ничего не нашел?
|
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Вот этого я как раз и не понял . Ничего особенного для масштабирования я не использовал - апишная функция StretchBlt. Масштабирование конечно не очень качественное, но зато более-менее быстрое. Но если нужно качественное, то есть событие OnScaleImage, где можно как угодно масштабировать изображение. |
|||
|
||||
offline |
|
|||
Опытный Профиль Группа: Участник Сообщений: 474 Регистрация: 7.2.2005 Репутация: нет Всего: 7 |
Да вроде при уменьшении картинки она выглядит более приятней, чем в стандартном TImage но не столь идеально как в компоненте G32. Будет ли идти работа в направлении улучшении качества картинки при изменении размера (Resample)?
|
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Функций для ресэмплинга существует много, своих я пока не придумал. Чужих брать не хочется. StretchBlt врядли заменю, разве что найду что-то более быстрое. Но естественно хотелось бы найти (или придумать ) что-то более качественное и быстрое. |
|||
|
||||
Vit |
|
|||
Vitaly Nevzorov Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 1 Всего: 207 |
Прикреплю пока тему... Думаю актуально, пусть повисит немного
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Спасибо Это сообщение отредактировал(а) s-mike - 20.3.2005, 10:40 |
|||
|
||||
p0s0l |
|
|||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
См. функцию SetStretchBltMode + HALFTONE -------------------- С уважением, г-н Посол. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
p0s0l, спасибо, но это я знаю. Но тут дело вот в чем: HALFTONE в SetStretchBltMode не работает под Win9x. Просто получается, что под этими ОС это свойство будет просто не востребовано, поэтому я решил, что лучше сделать событие на масштабирование.
Источник: http://msdn.microsoft.com/library/default....itmaps_6cth.asp |
|||
|
||||
p0s0l |
|
|||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
s-mike, это оно конечно есть такое дело... Но я бы всё равно добавил такое свойство, тем более что труда это много не отнимет, всего десяток лишних строчек... А то что оно не будет работать на Win9x - дык возьми свойство AlphaBlend у TForm - оно тоже не работает на Win9x, но всё-таки его добавили... Просто картинка в Win9x будет выглядеть хуже, чем в Win2k/XP - согласись: это всё же лучше, чем если бы везде выглядело "плохо" ? Тем более, учитывая то, что процент людей, использующи Win9x постоянно падает...
В общем, если бы я делал эти компоненты, то я бы сделал такое свойство... А ставить его в True или нет - оставил бы на совести программиста, который бы использовал эти компоненты, ему виднее - надо это или нет... Но дело твоё конечно ... Ну и я решил потестить немного... Честно говоря, почти ниодного дейсвия я не смог сделать без каких либо глюков, или непонятностей - очень сыро, недоделано и недоработано! 1. Только-только кинул компонент на форму... Загрузил картинку... Ставлю Transparent = True, FitImage = True, как лезут сплошные "Range Checking Error"... 2. FitImage - всё-таки нужно после его изменения в True перемасштабировать картинку... А то как-то неудобно, что нужно специально изменять размеры... 3. --- 4. Не вижу свойства Proportional - может я не хочу, чтобы всё было пропорционально ? 5. Странная работа FitImage - если изменить размер по горизонтали - то масштаб не меняется, если по вертикали - меняется... Странная логика... Кто сказал, что вертикаль главнее горизонтали ? В итоге не очень красивые ситуации получаются... 6. Zoom - имхо, должно быть ZoomX и ZoomY... Если Proportional = True, то эти Zoom'ы при изменении друг другу приравниваются... 7. FitImage = True, размер компонента больше размера картинки - Zoom не делается автоматически больше 100%... Имхо, нужно ввести доп. свойство типа АвтоУвеличения - если оно = True, то Zoom может делаться больше 100, иначе - не может. 8. В общем, как-то необдуманно и глючно работает система увеличения - нужно её пересмотреть, перерыть, перетестить. И главное - удобство использования, и гибкость. Гибкость почти отсутствует... Ладно, теперь беру TBitmapPanel: 9. В общем опять, загружаю эту же картинку... Хочу испробовать Transparent, ставлю в True... Но чтобы проверить, нужно увеличить компонент так, чтобы было незанятное картинкой место... Увеличиваю - опять "Range Checking Error"... Мдя... Возможно, это тот же глюк, что и в п.1 В общем, подумав, что всё-таки дело в особенности картинки, загрузил другую - эффект тот же... Вывод: если Transparent = True, и есть незанятое место, то Range Checking Error... Поглядев на свойства, понял, что тут больше тестить нечего... Достаю ScrollingImage, загружаю в него картинку: 10. Ставлю FitImage = True - Abstract Error... Причем дальше вроде как всё работает - размеры картинки подгоняются под размеры контрола... Ставлю FitImage = False - опять Abstract Error... В общем, при изменении FitImage вылазит ошибка 11. AutoCenter = True, FitImage = False, меняю размеры компонента - автоцентрирования не проиходит 12. Непонятно: CanScroll = True, CanScrollWithMouse = False, как теперь я могу скроллировать ? 13. По поводу п.12 думаю: наверное, есть какой-то метод для скроллирования... Вижу ScrollBy - он работает как со включенным CanScroll, так и с выключенным... Зато работает он как-то странно... Т.е. сдвигает картинку, но вообще по-левому... Зачем этот метод такой нужен ? Если он для внутреннего использования, то народовать его не надо... Вроде больше ничего интересного в свойствах не вижу... Теперь достаю FastScrollingImage: 14. Тоже очередная проблема с Transparent... 15. В общем, пробую Zoom - меняю-меняю - нифига не масштабируется... Так как и было в реальном масштабе - так и осталось (FitImage = False)... Запускаю проект - показывается в Zoom-масштабе... Т.е. в Design-time не работает эта весчь... 16. FitImage делаю True, тоже в Design-time не масштабируется... Хотя Zoom меняется... Видимо - это последствие п. 15... Запускаю проект - Exception EReadError, Error reading FastScrollingImage1.FitImage: Floating point division by zero... Потыкав еще свойства, я потом уже вообще ни при каких значения FitImage и Transparent не мог запустить проект... Дело спасло только удаление компонента и вытаскивание нового... 17. Ставлю свойство Cursor, выбрал крестик - запускаю - стрелочка... Свойство не работает... 18. Убавил размеры компонента, чтобы не полностью влезала картинка... Ставлю ScrollButton = mbRight, всё равно двигается не правой, а левой кнопкой... В общем я уже устал и тестить и писать... SBScrollingImage - даже не стал смотреть... Это сообщение отредактировал(а) p0s0l - 20.3.2005, 22:12 -------------------- С уважением, г-н Посол. |
|||
|
||||
s-mike |
|
||||||||||||||||||||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Уже в общем то исправлено, об этом еще Illusion Dolphin говорил.
В рантайм оно так должно и быть. В дизайн-тайм после исправлений abstract error тоже работает (обновление скоро выложу).
А это что значит?
Не видел чтобы в каком либо из графических вьеров или редакторов была такая возможность, ИМХО то что это есть в TImage - извращение.
Вот этого я до конца не понял. Изображение ужимается под размер контрола, если оно больше клиентской облсти компонента. Пропорционально.
Опять же говорю - сделать несложно, но вот какое этому практическое применение? Это разумная мысль, согласен.
Хм, хотелось бы услышать более конкретную информацию. 1) Что глючно? 2) В чем неудобства? 3) Какая нужна гибкость? Сам я может о чем-то не догадываюсь?
Range check error не замечал, но то что это свойство работает неправильно - факт. Буду исправлять.
Это не глюк, я и делал его с таким расчетом, достаточно посмотреть исходный код. Я делал компонент по образу и подобию ACDSee и там такого не наблюдается, изображение центрируется только при загрузке. Да и практической ценности ИМХО в этом никакой. Если я не прав - прошу поправить. Добавлено @ 23:10
Сделано свойство для TSBScrollingImage для возможности скроллинга только скроллбарами. Для других компонентов этой серии идентично CanScroll. Наверно надо его перенести все-таки в TSBScrollingImage, наверно так будет понятней. |
||||||||||||||||||||||
|
|||||||||||||||||||||||
s-mike |
|
||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Хе-хе, ScrollBy - это не моего компонента метод, а унаследован от TWinControl и предназначен естественно совершенно не для того. Так что претензии ко мне тут совершенно необоснованные. Для этого предусмотрен метод ScrollImage. Добавлено @ 23:29
Ндаа... Что-то там с VCL-ем не то. Не хайдится дочерний контрол-контейнер изображения. Попробую разобраться. |
||||
|
|||||
s-mike |
|
||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Симитировать не получилось, поподробнее плиз...
Похоже нужно это свойство спрятать. Оно ничего не дает и не даст. Для изменения курсора служат три других свойства: ImageCanScrollCursor, ImageDragCursor, ImageScrollDisabled. Но скорей всего в новой версии они будут переименованы. |
||||
|
|||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Странно, у меня все нормально. Может быть в таких случаях постить код с ошибкой? Или прислать мне на мыло? Спасибо за проведенное тестирование. Согласен, что компоненты немного сыроватые, хотелось побыстрее выложить новую версию. Скоро думаю уже выкладывать апдейт. В нем постараюсь исправить все вышеуказанные глюки. Насчет спорных вопросов хотелось бы услышать более серьезные аргументы, а также мнение других. |
|||
|
||||
p0s0l |
|
||||||||||||||||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
s-mike, я говорил "баги" и "непонятности"... одни исправляются, другие - объясняются... и заносятся в хелп, если что , а большинство пунктов - были непонятности и предложения... Баги касались почти только FitImage и Transparent - очень портят впечатление... особенно первое впечатление... Всё же стоит проверить получше компоненты, прежде чем выставлять на публику...
1) В большинстве случаев всё что связяно с FitImage - либо не работает, либо приводит к Exception'ам, приводящие к невозможности запуска проекта... 2) Неудобства - некачественное масштабирование... 3) Гибкость: а) добавить Proportional б) добавить свойство, чтобы Zoom мог быть > 100% в) разделить Zoom на ZoomX и ZoomY Для удобства, возможно, все опции масштабирования (если их будет больше 3-4) следует скомпоновать в одно свойство (как к примеру Options у DBGrid)... Насчет:
Или может мне просто надо в какой-то прямоугольник вписать картинку, пусть с небольшим искажением... Не одни ведь вьюверы показывают картинку на форме... Или ты делаешь конкретно для вьюверов компоненты (а судя по последним постам, я убеждаюсь что так, хотя об этом вроде нигде нислова) ?... Если так - то конечно же, всё это (то что выше) будет излишним... Тогда нужно работать в направлении поддерживаемых форматов и в направлении качественного масштабирования, а не сваливать эту часть на пользователя... По-крайней мере масштабирование-то можно постараться сделать (без StretchBlt)...
Возможно это были глюки Delphi после долгих Range Checked Error-ов... хотя... ??? В любом случае, мне кажется, если ты устранишь этот несчастный баг с FitImage, то проблем не будет...
Других глюков в TSBScrollingImage (кроме FitImage, Transparent и Zoom) - не замечено... ЗЫ: По поводу ScrollingImageNavigator - было бы неплохо, если бы как в ACDSee можно было выделять прямоугольник (т.е. так сразу можно указать место и масштаб)... -------------------- С уважением, г-н Посол. |
||||||||||||||||
|
|||||||||||||||||
s-mike |
|
||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Пожалуй так оно и было. Я перед этим исправлял баги
Тоже у меня нормально. Странно. Теперь насчет редактора и вьера. Хотелось бы конечно сделать универсальный компонент, который если и не будет, скажем иметь возможность качественного масштабирования или непропорционального масштабирования или поддержку многих форматов файлов, но будет давать возможность все это добавить. Такую возможность я ставил перед собой при написании этих компонентов. Плюс не хотелось бы изобретать велосипед. Ну например для масштабирования существуют различные функции, многие из них включены в библиотеки. Также существует много библиотек файловых форматов. Зачем мне делать еще одну такую библиотеку? Лучше ИМХО дать возможность использовать существующие. Теперь насчет непрпорционального масштабирования. Раз уж зашла речь о редакторах, то возьмем к примеру фотошоп (мой любимый ). В нем нет непропорционального масштаба, а функция эта осуществляется так же, как скажем изменение размера или добавление контраста. То есть это уже является отдельной функцией, для которой есть отмена и пр. Поэтому даже для редактора можно изменить необходимым образом свойство TScrollingImage.Picture и все изменения отобразятся в компоненте. В добавлении непропорционального масштаба я по прежнему не вижу необходимости. Вот насчет увеличения небольших изображений до размера окна - согласен, можно добавить. Также добавлю выбор метода масштабирования (обычный или Halftone). Ничего, работающего быстрее я пока не нашел (но ищу). Все функции качественного масштабирования, с которыми я работал, выполняются в несколько раз дольше StretchBlt c режимом Halftone. |
||||
|
|||||
p0s0l |
|
||||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
сейчас вытащил заново этот компонент - и на моё удивление свойство как бы и работает... Хм... Загружаю тот старый проект - протираю глаза, смотрю на свойство ScrollButton - оно = mbRight, запускаю - скроллится левой кнопкой! Так что всё-таки возможно, раз это какой-то непостоянный баг, этим страдает не только TSBScrollingImage (я сказал:
Проект сейчас вышлю... Еще одна сомнительная особенность, обнаружил пока возился со ScrollButton, (проверял на TSBScrollingImage и на TFastScrollingImage), если стоит mbRight: если держать правую кнопку (на картинке), потом увести мышь за пределы формы, а там уже отпустить правую кнопку мыши, то при возврате курсора на форму прога думает, что как будто-бы правая кнопка всё еще нажата... Этим не страдает mbLeft... Еще почему-то у TScrollingImage нет свойства ScrollButton ?... Добавлено @ 11:23 Уже собирался выслать проект с багом мышки, как выяснил причину... После некоторых экспериментов наметился такой синдром: если Zoom = 100, то ScrollButton работает... При любых других Zoom'ах скроллируется только левой кнопкой, независимо от значения ScrollButton. Этим страдает как TSBScrollingImage, так и TFastScrollingImage... -------------------- С уважением, г-н Посол. |
||||
|
|||||
p0s0l |
|
|||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Насчёт масштабирования - может всё-таки встроишь один из лучших методов, которые ты встречал ?
Т.к. тот, кто будет юзать этот компонент, вряд ли найдёт что-то более лучшее... То бишь сделать свойство СпособМасштабирования, где выбирается: 1 Простое масштабирование (StretchBlt без Halftone) 2 Halftone-масштабирование (StretchBlt с Halftone) 3 Качественное масштабирование (твоё масштабирование) 4 Пользовательское масштабирование (т.е. через OnScaleImage)... Так имхо, в этом смысле, было бы самое то -------------------- С уважением, г-н Посол. |
|||
|
||||
p0s0l |
|
|||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Если у TSBScrollingImage выключить ScrollBarVisible, то в Design-time нормально, а в run-time под скролл-бар всё равно отводится место, но оно не отрисовывается (ни Color'ом, ни фоном родителя...), при чем это обнаруживается только если сделать так, чтобы скроллировать можно было только либо по горизонтали, либо по вертикали (но не все вместе)
Да и потом как выяснилось, даже с 2 скроллбарами не всё ок (см. присоединенную картинку) - при запуске рядом со скроллбаром паказывается часть того, что под формой... Если я пишу SBScrollingImage2.Picture.Canvas.xxx (т.е. рисую), то меня перекидывают на показ левой-верхней части картинки (т.е. обнуляется ImagePos)... Имхо, лучше будет, если возможно, то ImagePos не менять... Это сообщение отредактировал(а) p0s0l - 21.3.2005, 13:32 Присоединённый файл ( Кол-во скачиваний: 24 ) bag1.gif -------------------- С уважением, г-н Посол. |
|||
|
||||
p0s0l |
|
|||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Навигатор: если обнулить свойство ScrollingImage, то картинка остаётся прежней...
Также, если обнулить Picture у связанного с навигатором имейджа, картинка тоже останется прежней (правда на этот раз исчезнет прямоугольник)... Для удобства, имхо, нужно сделать, чтобы свойству Picture можно было присваивать не только TBitmap, но вообще любой TGraphic (типа как метод LoadGraphic)... TSBScrollingImage: Неправильно настраиваются скроллбары - т.е. если я проскроллируюсь до конца вправо вниз с помощью мышки, на скроллбарах ползунки будут не в концах, а где-то в середине, хотя мотать уже и некуда... (это, кстати, видно на предыдущей картинке - видно уже самый правый край картинки, а на горизонтальном скроллбаре ползунок находится не в конце...) Непонятное описание: ScrollHome, ScrollEnd - имхо, надо указать, куда конкретно, а то что такое "конец изображения" ? (догадаться можно, но всё-таки...) Также, сделав ScrollEnd рядом с обоими скроллабарами появились неправильно отрисованные места (вернее, они не перерисовались, там остался прежний кусок картинки), скорее всего это тот же глюк, что и тот, который при запуске формы был... Это сообщение отредактировал(а) p0s0l - 21.3.2005, 16:18 -------------------- С уважением, г-н Посол. |
|||
|
||||
Vit |
|
|||
Vitaly Nevzorov Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 1 Всего: 207 |
Модератор: Сообщение скрыто. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
s-mike |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
p0s0l, со ScrollButton я понял в чем ошибка, спасибо, буду исправлять, а вот насчет:
я знаю, но к сожелению не понимаю, как это можно исправить Может кто-нибудь поможет? (К слову: этим страдает и IrfanView).
Из-за этого и глюк со ScrollButton
Lanczos3 масштабирует очень качественно (хоть и хуже, чем Halftone), но очень медленно, в 10 раз. Так что скроллинг изображения будет очень медленным. Если найду что-нибудь качественное и быстрое (а может кто-то посоветует?), то сделаю, а пока скорее всего придется довольствоваться 3 методами...
Интересная идея, подумаю. С остальным еще буду разбираться. |
||||||||
|
|||||||||
p0s0l |
|
||||||||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Можно попробовать решить проблему с правой кнопкой через SetCapture...
Добавляем SetCapture в BitmapMouseDown:
Добавляем ReleaseCapture в BitmapMouseUp:
В объявление класса:
А вот и сами процедурки:
-------------------- С уважением, г-н Посол. |
||||||||
|
|||||||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Спасибо, с SetCapture я когда-то пробовал. Но и в этом варианте и тогда мышь не отжималась, т.е. при отжатии кнопки мыши изображение все равно продолжало скроллиться.
|
|||
|
||||
p0s0l |
|
|||
Г-н Посол Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Интересно, какой метод масштабирования используется в ACDSee ? Найти бы такой, да прооптимизировать... Он кстати очень и очень походит на Halftone, почти 1:1... -------------------- С уважением, г-н Посол. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Но гораздо быстрее... |
|||
|
||||
Illusion Dolphin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 13 Всего: 63 |
Ещё пару скажу слов по поводу компонентов.
1) Zoom - хорошое свойство, НО некрасиво работает при его изменении. Если я возьму зум в 100, выделю кусок у изображения., а потом поставлю зум в 400, то получу не увеличение середины того куска, который видел, а другой кусок (происходит смещение). 2) В навигаторе было бы хорошо сделать настройку цвета того прямоугольничка, который показывает текущие рамки. 3) Хотелось бы чтобы было свойство принудительного обновления картинки. Именно такое обновление, которое происходить если вызвать приватный метод Resize. Это то, что наболело... Ща вот думал прибацать в проект пару компонентиков, но из-за пункта 1го может и придётся всё ручками опять бацать... да, ещё, неплохо было бы ввести свойство GetZoom - возвращает эффективный зум, т.е. при фитимэйдж чтобы возвращал с каким зумам отображает, а без фитимэйдж - просто свойство Zoom. Это сообщение отредактировал(а) Illusion Dolphin - 7.4.2005, 19:46 -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
s-mike |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Я как раз так и стремился сделать... Странно, так вроде оно и есть. Можно подробнее?
Есть. TScrollingImageNavigator.Shape.Pen.Color. В новой версии (2.1 - которую надеюсь скоро выложить) есть еще и событие на отрисовку навигатора и прямоугольничка.
А стандартные методы? TCustomScrollingImage.Invalidate.
А свойство Zoom разве работает не так? Или я чего-то не понимаю? |
||||||||
|
|||||||||
Illusion Dolphin |
|
||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 13 Всего: 63 |
Когда вручную пытался принудительно перерисовать после изменения свойства фитимэйдж этот метод не делал то. что был должен.
Прикольно но на счёт первого тут что-то или у меня не так работает или что... При увеличении зума у меня на месте картинка не остаётся. Юзаю TScrollingImage. Уходит всё почему-то в правый нижний угол о_О. Могу и прогу выложить (экзешник и кусок формы где твой компонент), но это окло метра будет. Файлик с прогой приложил. Это сообщение отредактировал(а) Illusion Dolphin - 7.4.2005, 22:10 Присоединённый файл ( Кол-во скачиваний: 23 ) new.zip -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Illusion Dolphin, с перемещением изображения после изменения зума глюки не мои, а у тебя в программе. Разбиратся я не стал, но если закомментировать обработчики события OnChangePos, то все нормально. То есть насколько я понял все из-за реализации механизма синхронного перемещения.
После изменения свойства FitImage изображение и так перерисовывается, так что этот пункт я до конца так и не понял. И если этот метод делал не то что нужно, то что же он делал? |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Пожалуй пришло время выложить обещанный апдейт до версии 2.1.
Ссылка для скачивания: ImgCtrls.zip (157 КБ) |
|||
|
||||
ДЫМ |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Не знаю, насколько это важно, может пустяк, но все же. У тебя размеры навигатора изменяются пропорционально высоте/ширине загруженного изображения, но если потянуть форму за верхний или нижний край, ничего не происходит, потому что ты пересчитываешь высоту оносительно новой ширины, а наоборот - нет. Так совпало, что я тоже недавно делал навигатор, для карты-схемы и тоже столкнулся с этой, проблемой. Решил с тобой поделиться, может заинтнресуешься.
Сначала добавляем обработчик сообщения WM_SIZING.
Это сообщение отредактировал(а) ДЫМ - 27.9.2005, 01:05 |
||||
|
|||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
ДЫМ, в общем согласен, что так не совсем красиво. Надо будет устранить.
|
|||
|
||||
MichaelS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 25.11.2005 Репутация: нет Всего: нет |
s-mike
можно тебя попросить об одном, компонент ScrollingImageNavigator очень подходит для моей задачи, т.е. нужно фиксированным! прямоугольником выделить нужную область фотографии и эту область сохранить, но у тебя увеличивает, если я ставлю увеличение = 0, маштаб 1:1, прямоугольник не двигается, и если изменять его размеры, тоже не двигается(( переправить твой код не хватает знаний((...подскажи как быть.. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Я планирую добавить возможность выделения в компоненте, но пока у меня мало времени для продолжения разработки компонента. Пока помочь ничем не могу. |
|||
|
||||
denmoroz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 10.12.2005 Репутация: нет Всего: нет |
ЕЩЁ! Найдена бага приисовании на SBScrollingImage (на других не пробoвал)!
Она состоит в том,что линии и всё такое рисуются не там где курсор мыши, а на ~1.5-2 см вниз и всторону. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Покажи, как рисуешь. Это сообщение отредактировал(а) s-mike - 15.2.2006, 13:45 |
|||
|
||||
FF90h |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 72 Регистрация: 1.7.2006 Где: Планета Земля Репутация: нет Всего: 1 |
s-mike
Не получается скачать, кинь пожалуйста другую ссылку! |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Поправил первый пост - прикрепил туда свежую версию Image Controls 2.1.1
|
|||
|
||||
Sportsmen |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 71 Регистрация: 3.11.2006 Где: Раша Родина наша- Старый Оскол Репутация: нет Всего: нет |
А что это за библиотека? Хотел скачать и посмотреть, но...
Скажите, пожалуйста. а как скачать?! Он мне HTML страницу скачивает? |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Image Controls 1.0
включает три компонента для скроллинга изображений, навигатор для этих компонентов, компоненты для простого отображения изображений, но с намного меньшим мерцанием, чем TImage, а также несколько полезных процедур. Немного, но в дальнейшем я планирую пополнять библиотеку новыми компонентами и процедурами. Уже совсем скоро думаю добавить компонент для отображения эскизов (Thumbnails). С помощью этих компонентов намного легче сделать просмотрщик типа ACDSee или IrfanView. И не только. Благодаря им программу можно сделать более удобной, придав ее элементам управления дополнительную функциональность Image Controls 2.0 1. Добавлен компонент TTexturePanel. 2. В TCustomScrollingImage добавлено масштабирование, а также автоматическое масштабирование по размеру компонента. 3. Изменена иерархия компонентов для скроллинга, теперь TFastScrollingImage наследуется от TScrollingImage. 4. Наследники TCustomScrollingImage, а также компоненты TBitmapContainer и TBitmapPanel теперь имеют свойство Transparent, позволяющее делать компонент прозрачным. 5. Добавлена возможность нестандартной отрисовки изображения в компонентах для скроллинга. 6. Добавлено изменение курсоров для скроллинга в design-time с помощью свойств ImageCanScrollCursor, ImageDragCursor, ImageScrollDisabled. 7. В TCustomScrollingImage добавлены свойства RealImagePos, RealImageLeft, RealImageTop, по которым можно узнать настоящие координаты изображения в компоненте, учитывая то, что оно может неполностью заполнять компонент. 8. Добавлено в TCustomScrollingImage свойство CanScrollWithMouse, позволяющее запретить скроллинг с помощью мыши. 9. Исправлен глюк в навигаторе при щелчке в нем правой кнопкой мыши. 10. В модуль ImgCtrlUtils добавлена процедура LoadGraphicToBitmap и немного подправлена функция IsEmptyPicture. 11. Добавлен модуль ImgCtrlsSkins. 12. Устранены другие небольшие баги и ошибки. Добавлено @ 18:20 Подробнее - в документации |
|||
|
||||
Sportsmen |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 71 Регистрация: 3.11.2006 Где: Раша Родина наша- Старый Оскол Репутация: нет Всего: нет |
Скачал, посмотрел. Первое впечатление отличное, что поразило больше всего Help русский!!! А для начинающего програмиста это просто находка. Большое спасибо!
|
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Иссесно хелп русский.
Автор ведь тоже не китаец Добавлено @ 00:35 ЗЫ. Автор компонента - автор первого поста. |
|||
|
||||
evstp |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 3.11.2006 Репутация: нет Всего: нет |
В архиве вродь версия 2.0 |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Нет, там версия 2.1.1. Просто текстовка не поправлена
|
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
Ага, первое впечатление отличное, да...
А когда начинаешь юзать........ В общем багов хватает. Не, компонент рулезный, но баги... Замучался уже. И править всё конкретно лениво - вдруг автор опять за код сядет. Да, возможность выделения области - было бы супер, сам сейчас это пытаюсь реализовать - столько ньансов... Так, из последнего: Прорисовщик компонента FastScroll отображает правую и нижнюю полоску пикселей при зуме только при определённых значениях ширины/высоты компонента. Так как блитом картинка тупо растягивается по ширине/высоте, не учитывая велечины зума. Отсюда же кстати и артефакты зуминга. Зум - вообще отдельная песня, после того как его меняешь - летит всё. Во первых, зачем-то по умолчанию стоит в качестве рисовальщика метод контейнера с картинкой, после изменения зума устанавливается рисовальщик класса FastScroll. Потом, перестаёт работать кнопка скрола - срабатывает только левая, хотя до зума работает та что в настройках. Ну это примерно понятно почему, тоже поправил, но следствие - не причину(сообщения все поймал в компоненте и обработал). Да уж, сумбурный пост получился, и негатива много, но компонент всё равно отличный - просто немного довести его надо. Для простейших вещей (для прямого назначения) его хватает за глаза, а вот что-то добавить (выделение области например) - уже баги попадаются. В любом случае - автору ШПАСИБА и РЕШПЕКТ. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Должен признать, что реализация у меня получилась весьма мутная. Даже я отказался от его практического использования, поскольку на доводку понадобилось бы слишком много времени. Поэтому решил ограничиться более простой, но намного более надежной реализацией с использованием GDI+. Правда производительностью скроллинга она не отличается. Вот и остается 2 дилемы - производительность либо практичность. FastScrollingImage и написан с целью обеспечить максимальную скорость скроллинга. Но когда необходимо было добавить масштабирование, то в компонент пришлось внести много костылей, чтобы не снизить прежнюю производительность в масштабе 100%.
Делать масштабирование субкомпонента уж слишком накладно Это сообщение отредактировал(а) s-mike - 18.11.2006, 02:39 |
|||
|
||||
Coriolis |
|
||||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
ПОДЕЛИСЬ КОДОМ!!! Пожалуйста Я тоже всё что добавляю делаю через GDI+
Дак после изменения зума при отрисовке вызывается Paint уже FastScroll'а, в нём примерно та же самая реализация что и в контейнере. Код практически 1:1 |
||||
|
|||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
В результате экспериментов было выявлено, что использования субкомпонента обеспечивает наивысшую скорость скроллинга. Особенно было хорошо заметно на компьютерах со встроенным видеоадаптером. Кстати, хотелось бы посмотреть на внесенные исправления ;) |
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
Так, я правильно понял - субкомпонент - это имеется в виду твой бипмап контейнер? (*стягивает на лоб ушанку и чешет затылок) Изменения я вышлю тебе мылом, но сам понимаешь - если уж ты признал наличие костылей, то мои доделки даже костылями не назвать... Намаялся я с проблемой нормальной работы + возможностью выделения прямоугольной области. Третью неделю ковыряю. Не каждый день конечно, но времени потерял много. Эта трабла мне напоминает мелкого и назойливого воробья - так и хочется достать свою любимую крупнокалиберную пушку (DirectX / OpenGL) и расстрелять этого воробья в клочья Вот какая идея: Создаю свой TBitmapContainer, наследуя от твоего. Метод Paint - ф топку, у всех владельцев тоже. В конструкторе этого контейнера создаю thread safe D3DX8 устройство, рендеринг выношу в отдельный тред, ставлю ограничение на макс ФПС в 25 скажем, при Visible - рендеринг идёт, not Visible - рендеринг на паузе. Сам рендеринг - бесконечный кикл, рендерится квад на весь handle родительского GraphicControl'а, для навигации и зума просто меняю текстурные координаты, если есть рамки - то еще по 4 квада на рамку. В итоге, что получается: 1) Вся отрисовка переносится на видео, проц на 99% свободен. Даже на оффисном компе будет летать, ибо единственный напряг для проца - переслать несколько байт для обновления текстурных координат и вызов команды драйвера, который в большинстве случаев переадресует вызов на железо. 2) Можно делать красивые анимированные рамки (текстурной анимацией например). 3) Качество сглаживания по прежнему остаётся управляемым, причем железо это сделает по любому быстрее проца. Минусы: требование DX8. Восьмой с XP по дефолту идёт, но на машинах с младшими операционками придётся ставить. Можно сделать и на OpenGl - тада DX вообще не нужен будет - gl дрова от видюхи обновляют... Но это всё займёт у меня больше времени чем на DX, я ogl не очень знаю (хотя, для такой простой вещи...). ВотЪ, такой вариант. Будет ли это работать с твоими конролами? Вот вопрос. |
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
Итак, что сделал:
Во первых, отбросил идею рендеринга в отдельном потоке - не имеет смысла. Во вторых реализовал задуманное на OpenGL, подключив стандартный дельфийский файл opengl.pas Сделал через DEFINE - если определено USE_OPENGL - отрисовка идёт через OpenGL. Все изменения затронули TCustomScrollingImage и TScrollingImage. В TCustomScrollingImage инициализация OpenGL при создании окна, обновление текстуры. В TScrollingImage добавил код в процедуру Paint - в случае существования USE_OPENGL используется не канвас с GDIшными блитами, а OpenGL код. Так же добавил property ZoomFilter (NEAREST, LINEAR) - сглаживание на халяву, как говорится. С точки зрения конечного пользователя ничего не изменилось (в плане кода). Поэтому просьба к людям, которые использовали ImageControls в проектах опробовать изменённый компонент и отписаться о результате. Сегодня запустил на работе у товарисча с компом с интегрированным видео - вполне шустро работало, по моему быстрей даже чем через GDI, чего и добивался. Известные глюки(сейчас над ними работаю): - переворачивает мелкую картинку. То, что добавлю в ближайшее время (после борьбы с глюками) - событие OnGLPaint, в котором юзер сможет отрисовывать что-то поверх картинки gl функциями, рамочки там, и прочую графику. Предупреждаю, баги компонента я не правил, они все так и остались. Я взял последнюю доступную версию и добавил GL код через DEFINE. В FastScroll чтобы заработало OpenGL надо после сразу после загрузки картинки сделать Zoom := 200; Zoom := 100; Чтобы включился нужный отрисовщик, это баг не мой - это баг компонента (или фича?.. я так и не понял s-mike). Вообще, s-mike пропал. Письмо для него назад приходит, на личку не отвечает. Баги бы поправить... Да он мне нужен еще чтобы поставил свой штамп "Одобряю" на коде. ;) Это сообщение отредактировал(а) Coriolis - 12.12.2006, 12:06 |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Я прошу прощения, пока не было и нету времени, в ближайшие дни обещаю вернуться к этому вопросу, возможно даже и к работе над компонентом...
|
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Посмотрел пример с OpenGL-ем. Интересная идея, но работает не совсем корректно. И лично я против влезания в сам исходник компонента для добавления не относящейся к нему напрямую функциональности. Предлагаю сделать вывод через OpenGL по другому: наследником. Для этого я переделаю иерархию классов, сделаю в основном классе виртуальные события самой отрисовки, но при этом основной класс будет управлять выводом (что выводить, когда, масштабирование, вывод скроллбаров).
|
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
О, а вот и сам разработчик.
На счёт работает некорректно - это был прототип, он должен был показать саму идею, тем более тут лежала старая версия твоих контролов, и я встраивал в старую версию. Твоя версия так вообще бажила по страшному - мне непонятно почему ты сделал растягивание картинки на область отображения - ведь она при зуминге искажается и "гуляет" при изменении размера компонента. По идее надо расчитывать размер куска отображаемой картинки исходя от зума а не от высоты/ширины компонента. Я в последней версии заколебался уже с этим бороться и сделал свой расчёт этого куска, он без искажений - как во всех нормальных редакторах. Сейчас я уже утилиту написал с использованием openGL версии, и отловил все баги которыу нашёл. По поводу того что встраивать в компонент так жёстко нехорошо - согласен на 100%, это совсем некрасиво, но так как тебя небыло, и единственный код который ты предоставил не позволил сделать это безболезненно... Так что сделал как смог. Но ведь работает же Выложу сюда на всякий случай последнюю версию компонента с OpenGL, я там дополнительный функционал по отрисовке примитивов (рамки, прямоугольники) вынес в отдельный компонент. Когда переделаешь иерархию - я напишу OpenGL отрисовщик, будет вообще супер. При проектировании обрати внимание на функцию CreateWnd - там у меня GL инициализируется на хандл окна компонента, поэтому мне как-то надо в отрисовщике тоже самое сделать. Это сообщение отредактировал(а) Coriolis - 12.12.2006, 13:11 Присоединённый файл ( Кол-во скачиваний: 35 ) Image_Controls.zip 105,59 Kb |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
То есть? Можешь объяснить, что ты имеешь ввиду? Область рассчитывается исходя из размера клиентской области компонента, масштаба, если картинка меньше ширины/высоты компонента, то она центрируется. То есть учитываются все факторы, находятся координаты, которые будет занимать изображение на компоненте, и координаты фрагмента изображения, который должен быть смасштабирован и отрисован в компоненте. |
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Меня посетила вот такая вот мысля. Насколько я знаю OpenGL хорошо работает только там где установлены драйвера на видюху от производителя, т.е. ATI или NVidia, а вы не задумывалсь, что в офисах или на ноутбуках могут ставить просто дефолтные драйвера, которые "не знают" как эффективно использовать OpenGL в результате вас ждут приличные тормоза из-за процессорной эмуляции. OpenGL не всегда нормально инициализируется на встроенных карточках. Вы что не видели сколько проблем иногда возникает после инсталяции игр. Одна видна нормально запускает другая глючит. Ладно игры там нужно 3D ускорение и без него совсем труба. Но тут же требуется 2D ускорение с которым легко справится стандартный драйвер, тем более, что он то как раз умеет работать с железом видюхи так Microsoft свои технологии поддерживает своими драйверами. Я рекомендую использовать GDI или GDI+. При их правильном использовании можно получить тоже неплохую скорость. Если, что я могу тоже включится в работу.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
alexeis1, речь о том и ведётся, чтобы сделать наследника.
Хочешь - через GDI делай, а хошь - через GL. Что касается скорости - у меня на ноуте видео интегрячее. Но визуально по скорости отличий не заметил. Посмотрю дома - с ускорителем. Там явно GL пошустрее будет работать.
С дефолтными просто задница какая-то, а не работа. И GL на машинах есть практически всегда. |
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Не сказал бы. Возможно так на ATI. Например, хрюша находит для моей старушки GeForce440 mx приличный драйвер, с которым можно отлично работать, и даже в игры играть и при этом никакой разницы практически нет. Аналогичная ситуация с Riva TNT. Для нее вообще при работе на DirectX реализуются все ее апартные возможности, а вот с OpenGL нифига, без драйвера от производителя все будет эмулироваться процом. ИМХО на OpenGl - это как из пушки по воробьям. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Coriolis |
|
||||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
Дорогой alexeis1, отвечаю на твои ИМХО.
По поводу "не задумывались ли вы" - задумывались. Я все проекты, а этот тем более тестирую на самых слабых кофигурациях. К примеру: Ноутбук: 650Mhz, 128 озу XP SP2, ATI RAGE MOBILE (BELL), дрова не поставлены на видео. Результат по скорости на глаз одинаков, НО стандартная отрисовка глючит (визуально) - при перемещении дуратские полосы появляются - не успевает отрисовывать. С OpenGL всё отлично, плюс ещё и сглаживание. На компах быстрее этого (стационарных уже) разницы никакой вообще нет. И это при всём при том что в OGL ещё и сглаживание есть, если его включить в стандартной отрисовке - она тормозит, но это понятно и так. Тестил именно на офисных компах, с интегрячим видео. На счёт
Резюмирую: я использую только стандартные функции отрисовки, которые реализованы в железе на любой видюхе у которой есть хоть какой-то ускоритель (не важно какой, хоть 3D хоть 2D) и будут нормально отрабатывать на винде от 98 (в 95 по дефолту opengl32.dll нет, нужно самому ставить). В любом случае, если довести до ума - вынести всё в отдельный отрисовщик - то метод отрисовки можно будет переключать на лету - пусть юзер сам смотрит что у него быстрее работает. Я эту понял твою мысль ещё с первого твоего поста Зааметь: о том что я собираюсь стрелять по птичкам с гаубицы я предупредил с самого начала У тебя какое-то однобокое представление об OpenGL, типа OpenGL=GAMES. Не забывай, это изначально промышленный стандарт. С помощью него очень удобно рисовать графические примитивы, к тому же ещё и ускорение от железа получаем. Для интереса глянь код что я добавил - его минимум. Это действительно удобная штука, работать с ним одно удоводьствие, размер программы он никаким боком не увеличивает, ибо opengl.pas - это заголовочный файл, скорость работы OpenGL - см тест я в начале привёл, баги и прочая радость - я использую только стандартные, первородные функции, очень сомневаюсь что они хоть где-то будут глючить. s-mike, Ок, простой пример и ты всё поймёшь: создай картинку-чекер - разлинованная в черно/белую клетку картинка. Сделай зум, скажем в 300% - и подёргай ширину/высоту компонента - увидишь (если сразу не увидел) искажения. Потом возьми мой компонент, сделай то же самое - искажений нет. Эти искажения из-за того что ClientWidth компонента не кратен ширине изображения после зума. Добавлено @ 17:13 Да, забыл сказать, даже если OpenGL будет эмулироваться - скорость будет такой же как у стандартной отрисовки, т.к. эмуляция идёт средствами того же GDI. |
||||
|
|||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Гм. ну это уже прелести кода отрисовки. Просто как мне кажется, что при правильной организации такого не должно быть. Тадо будет затестить компонентик -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
Не, дело не в коде отрисовки - там простой стреч блит стоит. Может полосы и не из-за того что не успевает отрисовывать, нет. Похоже на то, когда fps превышает герцовку монитора, а vsync не включен - но какая тут нафиг fps... Не знаю, знаю что моя отрисовка так не глючит.
Ну с этого и надо было начинать. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
А я кажется понял в чем проблема ;) Там небольшой баг, не выставляется halftone-сглаживание для StretchBlt. Его нужно вручную выбрать в комбобоксе Stretch Method (либо в свойствах самого компонента в design-time), тогда все будет отлично и со сглаживанием ;) |
|||
|
||||
Alexeyt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 332 Регистрация: 15.9.2006 Где: около Москвы Репутация: 1 Всего: 2 |
s-mike,
Да, надо же, не знал про этот компонент раньше. Пришлось писать свой "image на ScrollBox"... Сейчас посмотрю, но на всякий случай сразу предложение: св-ва "Умещать картинку" "Умещать только картинку, бОльшую размера комп-та" (не трогать меньшую) "Центрировать картинку" (для картинок, ментших размера комп-та) Я у себя это реализовал, но не помешает и здесь, если потом надумаю этот комопнент использовать... |
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
s-mike
"тогда все будет отлично и со сглаживанием " и с тормозами, незабывай. И это - совсем не выход. Сглаживанием ты спрятал косяк. Выход - как сделал я - правильно рассчитал размеры. И меня в этом вопросе не переспорить. Я же говорю - ты пошел по быстрому пути - натянул на окно вывода изображение. Отсюда и глюки. А надо натягивать на виртуальное окно - которое по размерам чуть больше окна компонента (или чуть меньше) - его размеры должны рассчитываться исходя из зума и размеров окна компонента, чтобы остаток от деления ширины/высоты на велечину зума был нулевым. Alexeyt, Да, ага, все кинулись дописывать, чтобы МОЖЕТ БЫТЬ, КОГДА НИБУДЬ, дорогой Alexeyt заюзал компонент :-D А серьёзно - это всё есть в этом мегакомпоненте, ищи лучше. |
|||
|
||||
Alexeyt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 332 Регистрация: 15.9.2006 Где: около Москвы Репутация: 1 Всего: 2 |
Пробую демо:
1. при уменьшении картинки (уменьшении масштаба меньше 100%) картинка (jpeg) идет какими-то квадратиками. Отчего это? Система Win XP SP2. 2. Опция AutoCenter что должна делать - центрировать картинку? И без нее все центрируется, а с ней инчего не меняется... 3. Ту опцию которая "may hang" я бы вообще запретил. Т.е. использовать бы не стал - на каком-то железе может зависнуть, зачем это нужно. 4. Не хвататет опции "ресемплинг такой-то". Как в IrfanView, там где-то 4-6 вариантов фильтра ресайза (правильно я понимаю, что это и есть ресемплинг?) А так комопнент неплохой, нужный... Coriolis
Спасибо, буду смотреть. Это сообщение отредактировал(а) Alexeyt - 31.1.2007, 19:34 |
|||
|
||||
s-mike |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Писал выше. Поставь в комбобоксе halftone сглаживание.
Опция влияет только на центрирование изображений, которые по размерам больше клиентской области компонента.
Железо тут причем? Зависит от реализации компонента для работы с конкретным графическим форматом. С TJpegImage работает. А вот с TRxGifImage не работает, зависает. Разбираться не было времени, подозреваю, что класс-декодер (как и в случае с TBitmap) просто не генерирует событие OnProgress. Узнать программно об этом невозможно, поэтому я и сделал предупреждение.
Насчет ресемплинга: смотри выше про halftone. Это сообщение отредактировал(а) s-mike - 31.1.2007, 19:54 |
||||||||
|
|||||||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
А тормоза причем тут к неверной отрисовке? Я написал, почему изображение может неправильно отрисовываться. Это во-первых. А во-вторых я не понимаю, чем твой "быстрый и более грамотный" метод отрисовки отличается от ничуть не менее быстрого COLORONCOLOR, то есть простой Stretch? Как его можно сравнивать с HALFTONE? Взгляни сам на разницу: http://smike.drkb.ru/temp/OpenGL.png http://smike.drkb.ru/temp/Halftone.png http://smike.drkb.ru/temp/Stretch.png Что касается грамотности. Возможно для OpenGL хранение смасштабированной текстуры изображения и является грамотным подходом. Но не забывай, что для хранения текстуры размером 2048x2048 потребуется более 4 мегабайт памяти. Твой вариант программы с изображением размером 2976x1952 в BMP формате масштабом 410% занимает в памяти более чем 80 мегабайт оперативной памяти и столько же виртуальной. В то время как мой вариант занимает более чем в 2 раза меньше (40 оперативной и 35 виртуальной). Поэтому я не исключаю твоего варианта, но я не считаю, что он самый грамотный и оправдан в любых ситуациях (особенно в случае ограниченного количества оперативной памяти). Они оба имеют право на жизнь и использовать нужно тот, который более оптимален в конкретной задаче. Это сообщение отредактировал(а) s-mike - 31.1.2007, 20:26 |
|||
|
||||
Alexeyt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 332 Регистрация: 15.9.2006 Где: около Москвы Репутация: 1 Всего: 2 |
s-mike,
Ясно. Хотя лучше бы влияла на любой случай (и бОльшие, и меньшие картинки). Напр.: видел в Тотал Коммандере 7 опицю "Центрировать изображение"? Она на все размеры влияет... С halftone ясно. А прикрутить другие фильтры ресайза можно? Я про IrfanView. |
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Возможно, не задумывался как-то. Возможно учту. В IrfanView при просмотре изображение тоже halftone-ом масштабируется. Дело в том, что "прикрутить" не такая уж и проблема (даже событие есть для этого), только не лучшим способом это скажется на производительности. Все-таки нужно различать фильтры для просмотра и для качественного уменьшения картинок. |
|||
|
||||
Alexeyt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 332 Регистрация: 15.9.2006 Где: около Москвы Репутация: 1 Всего: 2 |
Есть у компонента англ. страница/описание? Финскому товарищу показать, он как раз просмотр картинок делает, мучается с TImage...
|
|||
|
||||
s-mike |
|
|||
Опытный Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Пока нет.
|
|||
|
||||
Alexeyt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 332 Регистрация: 15.9.2006 Где: около Москвы Репутация: 1 Всего: 2 |
А почему в демо нет (или есть, я не вижу?) опции рендера через DirectX/OpenGL?
На скринах, выложенных в теме, рендерится через OGL, как это повторить? |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
||||
|
||||
Alexeyt |
|
|||
Опытный Профиль Группа: Участник Сообщений: 332 Регистрация: 15.9.2006 Где: около Москвы Репутация: 1 Всего: 2 |
Snowy,
хочешь для тестов jpg размером 7200 x 7200 x 24 bpp, в 4 МБайт? |
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
ААА!!! Пропустил мессаги все! Отвечаю поздно, ибо не видел!
s-mike, ЗАЧЕМ мне хранить ОТМАСШТАБИРОВАННУЮ картинку? В OpenGl хранится обычная картинка, никаких изменений масштабов нет, кроме подгонки размера до кратности степени двойки, ибо требование железа такое. Масшабирование происходит на этапе отрисовки - само железо растягивает. Почему такой размер в оперативке - честно не знаю. Разбираться лень уже. Скорее всего из-за моего плохого знания opengl, наверно где-то что-то надо было удалить после создания текстуры, а где и что - не знаю. Видимо копия текстуры так и валяется в оперативке... Зато с помощью opengl версии можно рисовать примитивы - рамочки и прочее. На скорость это не повлияет. Да, при больших текстурах тоже тормозит безбожно. в смысле >1024x1024. Я делал это для проекта, в котором 1024x1024 - предел, поэтому не тестил на больших. Нда, таки надо было сразу делать с разбивкой текстуры на мелкие квадраты, тада размер бы вообще не имел значения. Мож сделаю, но только когда ты переделаешь компонент - возможность создания своих отрисовщиков добавишь. Тогда лучше на DirectX сделаю - я его лучше знаю. |
|||
|
||||
evstp |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 3.11.2006 Репутация: нет Всего: нет |
Хееех... Видимо проект совсем заглох =(
Жаль =((( |
|||
|
||||
Coriolis |
|
|||
Ищущий Профиль Группа: Участник Сообщений: 101 Регистрация: 22.8.2005 Репутация: нет Всего: 1 |
Что значит заглох? Компонент вполне юзабельный - бери да используй.
У автора были планы по переработке тотальной - но у все у нас заботы да работы (кушать что-то надо ;) ). А так заявленный функционал работает на 5, а если надо что-то сверх - это уж самому, конкретно под твою задачу. |
|||
|
||||
ahito1 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 228 Регистрация: 20.8.2007 Репутация: нет Всего: -1 |
Спасибо автору за компоненты! У меня вопрос: каким образом можно сделать масштабирование изображения с помощью трэкбара или кнопок "+" и "-"?
|
|||
|
||||
Amalthea |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.11.2010 Репутация: нет Всего: нет |
Хороший компонент! Спасибо!
Правда при загрузке больших картинок (больше 400 кБайт) открывается либо белый лист, либо искаженная картинка. Использовала TSBScrollingImage. Можно ли исправить? Это сообщение отредактировал(а) Amalthea - 12.4.2012, 12:28 |
|||
|
||||
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |