Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Операции С Избражением  (Прочитано 6034 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shouldercannon
Постоялец

ru
Offline Offline

« : 14-11-2011 15:36 » 

С помощью чего можно сделать что-то подобное как в ACDSee, а именно:
# Увеличить/уменьшить изображение
# При большом увеличении изображения перемещать его для просмотра отдельных частей
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 14-11-2011 16:08 » 

Я надеюсь, ты не надеешся на фильмовые чудеса? Когда из ужасной пикселизации выводят изображение очень четкое в деталях?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Shouldercannon
Постоялец

ru
Offline Offline

« Ответ #2 : 14-11-2011 16:37 » 

Нет. Немного поторопился. Буду разбирать по порядку. Есть изображение 950x823 px. Как загрузить это изображение в Image размером 300x300 px?
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #3 : 14-11-2011 16:39 » 

Если качество при масштабировании не критично, то проще всего использовать компоненты TImage или TPaintBox, в противном случае любой оконный компонент и GDI+
Записан
Shouldercannon
Постоялец

ru
Offline Offline

« Ответ #4 : 14-11-2011 16:47 » 

Не критично. Я дальше хочу реализовать увеличение/уменьшение изображения.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 14-11-2011 16:51 » 

Увеличение и уменьшение и есть масштабирование. При увеличении больше чем экран, можно применять сглаживание цветов. Чтоб пикселизация не так была заметна.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #6 : 14-11-2011 16:53 » 

У компонента TImage есть свойство Stretch, если его поставить в True, то содержащаяся в компоненте картинка растягивается по размеру компонента. Таким образом меняя размер компонента можно масштабировать картинку.
Записан
Shouldercannon
Постоялец

ru
Offline Offline

« Ответ #7 : 14-11-2011 18:00 » 

Первая часть готова. Теперь затруднения с увеличением/уменьшением изображения внутри самого Image. Как такое сделать?
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #8 : 14-11-2011 18:27 » 

Shouldercannon, я тебе уже описал способ масштабирования, не влезая в тонкости GDI:
Цитата
Таким образом меняя размер компонента TImage можно масштабировать картинку.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 15-11-2011 00:11 » 

zubr, о другом речь. есть один Image 100х100 с картинкой 1000х1000, и есть второй Image 100х100. Нужно во втором Image показать кусок первого, в масштабе 1:1.

2 ТС. разберитесь, как устроен TImage. Это - визуальный компонент, который можно двигать по форме, менять размеры, играться свойствами и т.д. У него есть свойство Canvas, которое, как у всех графических компонентов, занимается отрисовкой на экране. Далее, у него есть свойство Picture, которое может содержать какую-то картинку. насколько я понимаю, у вас это Bitmap. имеем:

Image1.Canvas - то, что мы видим на экране;
Image1.Picture.Bitmap.Canvas - реально загруженная картинка, ее "холст", так сказать.

Наша задача: взять кусок оригинального холста, отмасштабировать, и куда-то вывести. Это можно сделать функциями дельфи, но обычно это делается функциями виндового апи, типа BitBlt.

Эти функции, как правило, работают именно с канвасом (а точнее, GDI-ным дескриптором канваса, хэндлом, только это не виндовый хэндл, не дескриптор окна, а дескриптор объекта в графической подсистеме GDI. ну да не суть). Суть в том, что эти функции крайне примитивны, но работают на низком уровне и работают очень быстро, т.е. вполне можно масштабировать в реальном времени, типа, двигая ползунок на экране видеть, как меняется картинка.

Это первая часть задачи. Теперь вторая часть: куда выводить. Вариантов много. Например, в PaintBox.  Но PaintBox рисует по событию OnPaint. т.е. нужно в этом событии выяснить, в каком масштабе юзер хочет видеть картинку, и какой ее кусок, выдрать его, и отрисоваться. Соответственно, когда юзер меняет масштаб или область, нужно тупо сказать PAintBox-у Invalidate, а он уже в своем событии нашими стараниями выяснит, чего инвалидэйт, и в каком масштабе.

Можно отрисовывать в некий виртуальным Bitmap. т.е. объявить поле, типа, fBitmap:  TBitmap, при любых действиях пользователя (изменении масштаба или региона) формировать этот битмап (т.е. "выдранный" кусок из первого Image   в нужном масштабе) и тупо его хранить. Я бы именно так и сделал. А вот уже потом его можно отрисовать куда угодно: заассайнить (assign) второму Image, или в PaintBox-е отрисовывать - не суть. Плюс здесь в том, что "математика" (т.е. наиболее ресурсоемкие действия, типа выдирания и масштабирования нужного куска) происходят единожды - по действию пользователя, а дальше мы тупо отрисовываем готовое изображение, наш виртуальный битмап. В первом же способе каждый раз при перерисовке PaintBox-а мы каждый раз пересчитываем изображение. Для современных компов это ерунда, но привыкать писать херню вредно, потом это уже не лечится.

Есть у вашей задачи и третий момент, как пользователь выделяет на первом Image нужный регион для масштабирования. Здесь имеет смысл рыть либо в сторону регионов (если нужно отмасштабировать непрямоугольный участок изображения, звезду, например), либо в сторону функции канвас DrawFocusedRect, если не ошибаюсь. (она, собственно, тоже на регионах работает, но это частный случай именно для рисования "двигающихся" рамок).

успехов Ага

Добавлено через 2 минуты и 8 секунд:
главное уясните для себя, что у любого Image два канваса: Image1.Canvas - это то, что мы видим, Image1.Picture.Bitmap.Canvas - это то, что реально есть.
« Последнее редактирование: 15-11-2011 00:15 от x77 » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 15-11-2011 08:02 » 

zubr, тут, наверно, главное, что надо добавить, это что TImage по размерам может быть больше формы (или панели) просмотра, и соответственно на форме или в панели появятся scrollbar.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #11 : 15-11-2011 08:12 » new

Ну скролбары можно отключить.
А по сообщениям WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP соответсвенно включать перемещение TImage, перемещать, отключать перемещение. Тогда будет примерно как в ASDSEE.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines