| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Увеличение/уменьшение фрагмента TImage на форме |
| Автор: Amalthea 4.2.2012, 15:01 |
| Здравствуйте! Только начала изучать Делфи7. Не нашла информации на сайте. Решила спросить. У меня есть дочерняя форма с компонентом TImage с загруженной картинкой, которая по размерам полностью вписывается в форму. ClientHeight/Whidth доч.формы сделала равными 80% от ClientHeight/Whidth главной формы (но это не суть). Как увеличить/уменьшить фрагмент интересующий части изображения TImage (с помощью колесика на мышке), чтобы ClientHeight/Whidth оставался прежним (те же 80% от родит.формы)? Как изображено на картинках ниже. ![]() Я так понимаю надо использовать OnMouseWheel. А как, не могу найти. ![]() И в идеале еще нужно создать инструмент Лупа для увеличения, уменьшения фрагментов картинки. ![]() Спасибо. |
| Автор: Illusion Dolphin 4.2.2012, 22:38 |
| Пробовали заглянуть в шапку раздела http://forum.vingrad.ru/forum/topic-45912/kw-image-controls.html ? |
| Автор: Amalthea 5.2.2012, 09:07 |
| Спасибо, посмотрю |
| Автор: DimaDD 6.2.2012, 18:30 | ||
| Воспользуйтесь событием OnMouseWheel той формы, на которой лежит TImage, в его обработке и реализовывайте масштабирование. Хороший доп. вариант ещё - поместить TImage не прямо на форму, а на ScrollBox, занимающий всю клиентскую область. Тогда при слишком большой картинке будут появляться полосы прокрутки (для них лучше свойства Tracking и Smooth сделать True). Но тогда же и колёсико мыши станет не масштабировать, а двигать бегунки полос (т.е. ScrollBox будет перехватывать события от колёсиков). Для учёта таких случаев можно сделать масштабирование не одним только колёсиком, а, например, сочетанием "колёсико+Ctrl": просто в обработчик OnMouseWheel формы (не ScrollBox'а) надо добавить проверку:
Тут вместо ZoomOut и ZoomIn должны быть Ваши масштабирующие процедуры. |
| Автор: kozerog 2.3.2012, 22:50 |
| Спасибо большое, я тоже буду пробовать. |
| Автор: Amalthea 12.4.2012, 12:13 |
Воспользовалась Вашей библиотекой компонент Image Controls 2.0 (хорошая библиотека, спасибо!), а именно компонентой TScrollingImage. Рисую сетку долгот и широт на карте:![]() Затем начинаю масштабировать картинку, и сетка начинает выглядеть следующим образом (часть линий не прорисовывается): ![]() Кто-нибудь знает, как решается данная проблема, есть ли способы? И еще одна проблема. Когда открываю карту большого размера, например 6521x3261 px, получается такая 'красота' (рис. ниже), линии и цвета искажаются, а если карта размера 3260x1630, то открывается в нормальном виде через раз, если карта такого же размера, но в градациях серого, то все отображается прекрасно. ![]() С чем это может быть связано? И еще один вопрос. Мне на карту нужно наложить некоторые полупрозрачные области (тень на Земле) можно ли установить прозрачность пикселов или таких возможностей нет в Delphi? Нашла только как сделать прозрачной форму. Спасибо! |
| Автор: Illusion Dolphin 12.4.2012, 13:28 |
| "часть линий не прорисовывается" - это потому что используется алгоритм Nearest для изменения масштаба. Как писал автор: Но если нужно качественное, то есть событие OnScaleImage, где можно как угодно масштабировать изображение. Тут я Вам также рекомендую искать слово SmoothResize . На счёт карты искажённой - тут хорошо бы видеть сам файл, такое ощущение что он не 24 bit RGB. Например, JPEG может быть в CMYK - и делфи до последнего времени это не поддерживало (xe2 - полёт нормальный). |
| Автор: Amalthea 13.4.2012, 10:17 |
| Illusion Dolphin спасибо, поищу событие OnScaleImage. Насчет карты, она у меня в цветовой модели RGB, 8 bit, с расширением jpg и bmp. Открывала их в фотошопе, тоже часть сетки пропадает при уменьшения масштаба. Если толщину линий делать толще (>1 px), то конечно лучше отображается. А по поводу полупрозрачных областей. Можно ли установить прозрачность пикселов или таких возможностей нет в Delphi? Нашла только как сделать прозрачной форму. Вы об этом что-нибудь слышали? |
| Автор: Illusion Dolphin 13.4.2012, 12:15 |
| Можно ли установить прозрачность пикселов или таких возможностей нет в Delphi? Всё можно. Скорее всего Вам надо полупрозрачное рисование. Детальнее опишите задачу я тогда расскажу что надо делать. Если нарисовать на карте что-нибудь полупрозрачное то тут можно или ручками для старых делфи (http://forum.vingrad.ru/topic-28975.html) или через canvas для новых версий делфи. P.S. картинка с наклоном - там идёт смещение битов, обычно такое бывает когда 32 битная картинка читается как 24 бита. Возможно где-то не установлен Bitmap.PixelFormat := pf24Bit. |
| Автор: Amalthea 13.4.2012, 14:56 |
| Спасибо за помощь! У меня Delphi 7.0. Использую компонент TScrollingImage. Загружаю в него картинку в растровом формате jpg или bmp. Причем проверяла в фотошопе, они у меня RGB, 8 bit. Т.е. мне их перевести в 24 битные? Кстати, можно загружать в Delphi картинки в векторном формате, например cdr? Рисую сетку долгот и широт таким образом: ScrollingImage1.Picture.Canvas.MoveTo(0, Sh); ScrollingImage1.Picture.Canvas.LineTo(ScrollingImage1.Picture.Width, Sh); Затем надо наложить поверх карты полупрозрачную область (тень на Земле). Скорей всего мне нужно полупрозрачное рисование, как вы написали и лучше узнать как это делается через Сanvas для новых версий Delphi. Если мои картинки не 24 бит, то они не будут нормально отображаться в Delphi 7.0 пока не установлю: Bitmap.PixelFormat := pf24Bit. Так? Еще вопрос. Откуда вы черпаете столько нужной информации по Delphi. Во всех книжках, что я читала все написано поверхностно, больше для начинающих. Может посоветуете, что почитать? |
| Автор: Illusion Dolphin 14.4.2012, 00:27 | ||
| Если надо рисование прозрачное - может быть лучше будет поставить XE2 . 24 бита это 3 канала (R,G,B) каждый по 8 бит итого 24. "Кстати, можно загружать в Delphi картинки в векторном формате, например cdr?" - cdr навряд ли Вы найдёте, но можно поискать на torry.net для начала. Сетку правильнее будет рисовать в момент OnScaleImage тогда не будет проблем с масштабом. В это событии надо пересчитать координаты и нарисовать часть сетки для текущего масштаба. Полупрозрачную область можно наложить в том же OnScaleImage. Для XE2 можно загрузить 32 битную картинку в pngimage, к примеру, и потом отрисовать (Canvas.Draw) на изображении сформированном в OnScaleImage с учётом пересчёта масштаба. Чтобы не было проблем с форматом - грузите катинки так:
|
| Автор: Amalthea 17.4.2012, 08:18 |
| Спасибо за советы! Но проблему с искаженным отображением картинки так и не удалось решить, ваш пример не помог. Значит дело не в битах? В итоге удалила те карты, что плохо отображались. Теперь проблем нет, а вопрос остается открытым. Может это связано с отрисовкой через OpenGL, т.к. я использую компонент TScrollingImage? В случае масштаба, думаю так оставить (OnScaleImage не использую, т.к. есть OnZoom), тем более, если даже в фотошопе при уменьшении масштаба этой же картинки с сеткой, часть линий тоже как бы исчезает. А куда мне до разработчиков фотошопа |
| Автор: bems 17.4.2012, 09:03 |
| почему бы не использовать emf(метафайлы)? это сохранённая последовательность вызовов функций рисования, то есть по сути вектор |
| Автор: Amalthea 18.4.2012, 13:29 | ||
У меня есть карты в формате emf. Только как их правильно открывать? Я делала так, но похоже не правильно, они не отображаются.
|
| Автор: bems 18.4.2012, 19:07 | ||||
| Зачем загружать в битмап, это же даст тот же растр как-то так
масштабирование
|
| Автор: Amalthea 19.4.2012, 07:41 |
| Спасибо! Получилось открыть. А можно на карте рисовать полупрозрачные области (например тень на Земле), а не только контуры? |
| Автор: bems 19.4.2012, 08:16 | ||
Полноценной альфы нет (если только не переходить на работу с отдельными пикселями, но это уже не вектор и плохо масштабируется), но можно добиться похожего эффекта. Для теней должно хватить
впиши это в мой пример сразу после второго цикла построения сетки |
| Автор: Amalthea 21.4.2012, 08:09 |
| Спасибо большое, получилось! |