Вывод фотографий на панель. Динамическое создание объектов в Gambas.

   

Продолжая тему работы с Изображениями в это статье я приведу пример, как можно вывести несколько изображений на панель по подобию работы таких программ, как ShotWell и DigiKam.

Для работы разместим на форме два элемента: ScrollView и ButtonBox. В ScrollView мы будем выводить изображения, а по кнопке ButtonBox откроем папку с фотографиями.
Для ScrollView1 нужно задать свойство Arrangement = Row — это чтобы наши изображения при выводе располагались рядами.

Вот что у нас получится в итоге:

Привожу полный код программы с комментариями:


Public Sub ButtonBoxOpenFile_Click()
Dim hImage As Image
Dim hArea As DrawingArea
Dim SizeArea As Integer = 100
Dim mFiles As String

Dim sFile As String

Dialog.Path = "/home" 'Задаем директорию в которой будет открыт диалог выбора
If Dialog.SelectDirectory() Then Return 'Инициируем диалог выбора директории
ButtonBoxOpenFile.Text = Dialog.Path

mFiles = Dir(Dialog.Path, "*.jpg", 1) 'Оператор Dir возвращает массив файлов из директории по заданому шаблону

For Each sFile In mFiles 'начинаем цикл по массиву файлов - наших изображений
hImage = Image.Load(Dialog.Path & "/" & sFile) 'Загружаем изображение в объект hImage
hImage = hImage.Stretch(SizeArea, SizeArea) 'Уменьшаем изображение до размера эскиза 100*100, чтобы вошло несколько изображений на панель

hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом
hArea.Cached = True 'Задаем свойство кеширования
hArea.Border = 3 'Устанавливаем тип границы
hArea.Width = SizeArea 'Задаем размер облости вывода изображения
hArea.Height = SizeArea

Draw.Begin(hArea) 'Выводим изображение
Draw.Image(hImage, 0, 0)
Draw.End
Next
End

Тут стоит обратить внимание на следующие важные моменты.
hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea

Здесь мы с помощью оператора «New» создаём в цикле новый объект «DrawingArea». Програмно создавать и инициировать можно не только переменные и массивы, но и видимые элементы формы (хоть 100 кнопок вывести на форму в цикле можно). При желании можно вобще всю форму прописать программно, как это делается в языках в которых отсутствует графические средства разработки интерфейса IDE, например python, C++.
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом

Для данного примера это строка не важна, оно будет необходима, если мы заходим обращаться к какому-либо событию динамически созданного объекта.
Об этом я расскажу в следующей статье.

Draw.Begin(hArea) 'Выводим изображение
Draw.Image(hImage, 0, 0)
Draw.End

А этот момент описан в статье
Метод «Draw.Image» обеспечивает вывод изображения в контейнер hArea. Как бы рисует его.

Единственный недостаток этого примера и предыдущего, это то, что изменение размера изображения происходит непропорционально, а для фотографии это неприемлемо.
Но применив немного математических расчётов это легко можно исправить. Все что нужно это определить на сколько нужно изменить ширину изображения если длинна его будет задана. Ну и в дополнение я определю сдвиг изображения на центр hArea. Это парамерты dH и dW.

If hImage.Height > hImage.Width Then
K = SizeArea / hImage.Height
Width = Int(hImage.Width * K)
Height = Int(SizeArea)
dW = Int((SizeArea - Width) / 2)
dH = 0
Else
K = SizeArea / hImage.Width
Height = Int(hImage.Height * K)
Width = Int(SizeArea)
dH = Int((SizeArea - Height) / 2)
dW = 0
Endif

Вот таким кодом мы просто рассчитаем ширину и высоту изображения и сдвиг его относительно вертикали и горизонтали.

Весь код последнего варианта выглядит так:

Public Sub ButtonBoxOpenFile_Click()
Dim hImage As Image
Dim hArea As DrawingArea
Dim SizeArea As Integer = 100
Dim mFiles As String

Dim sFile As String

Dim K As Float
Dim Height, Width, dH, dW As Integer

Dialog.Path = "/home" 'Задаем директорию в которой будет открыт диалог выбора
If Dialog.SelectDirectory() Then Return 'Инициируем диалог выбора директории
ButtonBoxOpenFile.Text = Dialog.Path

mFiles = Dir(Dialog.Path, "*.jpg", 1) 'Оператор Dir возвращает массив файлов из директории по заданому шаблону

For Each sFile In mFiles 'начинаем цикл по массиву файлов - наших изображений
hImage = Image.Load(Dialog.Path & "/" & sFile) 'Загружаем изображение в объект hImage

If hImage.Height > hImage.Width Then
K = SizeArea / hImage.Height
Width = Int(hImage.Width * K)
Height = Int(SizeArea)
dW = Int((SizeArea - Width) / 2)
dH = 0
Else
K = SizeArea / hImage.Width
Height = Int(hImage.Height * K)
Width = Int(SizeArea)
dH = Int((SizeArea - Height) / 2)
dW = 0
Endif

hImage = hImage.Stretch(Width, Height) 'Уменьшаем изображение до размера эскиза 100*100, чтобы вошло несколько изображений на панель

hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом
hArea.Cached = True 'Задаем свойство кеширования
hArea.Border = 3 'Устанавливаем тип границы
hArea.Width = SizeArea 'Задаем размер облости вывода изображения
hArea.Height = SizeArea

Draw.Begin(hArea) 'Выводим изображение
Draw.FillRect(0, 0, SizeArea, SizeArea, Color.Gray) 'Здесь мы просто заполним всю область серым цветом
Draw.Image(hImage, dW, dH, Width, Height) 'выведем со сдвигом
Draw.End
Next
End

Проект можно скачать отсюда: mArea

До новых встреч!


Производительность Gambas

   

Озадачился я тут некоторой медлительностью Гамбаса и решил сравнить с аналогичными опирациями в python.
Поставил эксперемент:

Откравался файл с изображением (фотография примерно 10Мб) и выполнялся разворот её на 45 градусов:

Public Sub Form_Open()
Dim hImage As Image
Dim i As Integer

For i = 1 To 10
Print Now
hImage = Image.Load("/home/archer/Programm/python/DSC00188.jpg")
hImage.Rotate(45)
Next
End

Результат:
25.01.2012 17:02:22
25.01.2012 17:02:24
25.01.2012 17:02:26
25.01.2012 17:02:28
25.01.2012 17:02:30
25.01.2012 17:02:32
25.01.2012 17:02:33
25.01.2012 17:02:35
25.01.2012 17:02:37
25.01.2012 17:02:39

Код на Питоне:
from PIL import Image
import time

for i in range(10):
localtime = time.asctime( time.localtime(time.time()) )
print localtime
im = Image.open("DSC00188.jpg")
im.rotate(45)

Результат:
Wed Jan 25 17:04:04 2012
Wed Jan 25 17:04:05 2012
Wed Jan 25 17:04:07 2012
Wed Jan 25 17:04:08 2012
Wed Jan 25 17:04:09 2012
Wed Jan 25 17:04:11 2012
Wed Jan 25 17:04:12 2012
Wed Jan 25 17:04:14 2012
Wed Jan 25 17:04:15 2012
Wed Jan 25 17:04:17 2012

Вобщем результат конечно не точный и условия не идеально, но тем не менее видно даже в таком случае, что Python работает быстрее. Например загрузка изображений у него вобще махом просиходит, а у Гамбас 1 секунда на каждую загрузку.

Такие дела вот…


gb.image и вывод изображений на форму

   

Добрый день!
Сегодня я хочу по говорить о библиотеке gb.image и выводе изображений на форму.
По моему эта тема ещё не была освещена в нашем блоге.

Реализуем простой пример:
Откроем файл с изображением и выведем его на форму в контейнер «DrawingArea», при этом изменим размер изображения чтобы оно помещалось в DrawingArea полностью.
А после изменим яркость.

Начнём.
Создадим новый проект выбрав опцию «Обработка изображений». Т.е. в проекте должны быть подключены компоненты gb.image и gb.image.effect.
Разместим на форме контрол контейнер DrawingArea с именем DrawingArea1.
Изменим свойство Border на Plain, чтобы можно было видеть границы изображения.
И изменим свойство Cashed на True. Это необходимо иначе будет возникать ошибка!
Ниже разместим контрол «ButtonBox» с именем ButtonBoxOpenFile. Кстате это новый контрол в версии 3. Он объединяет в себе контролы TextBox и Button. Очень удобен для реализации всевозможных выборов, позволяет и осуществлять выбор нажатием и выводить результат выбора в поле ввода.
FMain

Зададим глобальную переменную, объект в котором и будет хранится наше изображение.

Public hImage As Image

По событию Click() ButtonBoxOpenFile разместим код открытия файла изображений.

Public Sub ButtonBoxOpenFile_Click()
Dialog.Path = Application.Path
Dialog.Filter = ["*.jpg; *.jpeg; *.png; *.bmp", "Picture files"]
If Dialog.OpenFile() Then Return
ButtonBoxOpenFile.Text = Dialog.Path

Далее необходимо загрузить файл изображения в объект hImage.

hImage = Image.Load(ButtonBoxOpenFile.Text)

И вот теперь можно выводить или может даже точнее сказать РИСОВАТЬ изображение на DrawingArea1.
А рисовать выбранное изображение будет следующий код.

Draw.Begin(DrawingArea1)
Draw.Image(hImage, 0, 0)
Draw.End

За вывод изображение отвечает классы Draw или Paint (который позволяет работать с кистью). Мы будем использовать Draw.

Draw.Begin(DrawingArea1) — начинаем вывод в поле DrawingArea.

Draw.Image(hImage, 0, 0) — выводим изображение hImage с началом в 0.0 (левом верхнем углу)

Draw.End — заканчиваем вывод изображения

Причём конструкция
Draw.Begin(DrawingArea1)
Draw.End

является обязательной! А между началом и концом могут располагаться различные способы вывода.

Вот весь код проекта:

Public hImage As Image

Public Sub ButtonBoxOpenFile_Click()
Dialog.Path = Application.Path
Dialog.Filter = ["*.jpg; *.jpeg; *.png; *.bmp", "Picture files"]

If Dialog.OpenFile() Then Return
ButtonBoxOpenFile.Text = Dialog.Path

hImage = Image.Load(Dialog.Path)
Draw.Begin(DrawingArea1)
Draw.Image(hImage, 0, 0)
Draw.End

End

Теперь можно запустить и программа будет уже работать. Вот только ваше изображение, если вы выберете фотографию наверняка не выйдет в область вывода DrawingArea1.
Так давайте уменьшим наше изображение, смасштабируем под размеры DrawingArea1.
А сделать это очень просто с помощью того же метода Draw.Image.

Draw.Image(hImage, 0, 0, DrawingArea1.Width, DrawingArea1.Height)

Изображение конечно может стать непропорциональным, но не будем усложнять пример математическими расчетами.

Следующей нашей задачей было добавить яркости. За это отвечает метод Balance компонента gb.image.effect.

hImage.Balance(0.5, 0, 0)

Параметры метода это: яркость контраст и гамма соответственно. Изменяемые от -1 до 1. Значение 0 означает, что характеристика изображения не меняется. Т.е. в примере мы изменяем только яркость в +0,5. Располагать метод нужно до начал вывода изображения (до Draw.Begin).

Вот и все на этом наш простой пример законче.
Хоть он и простой, но учит главному — выводу изображения на форму. А методов по изменению и преобразованию изображений в библиотеке gb.image.effect предостаточно для любых экспериментов.
Можно и создавать градиенты, добавлять тени, просто заполнять область фоном. Поварачивать изображения, делать зеркальные отражения и многое другое, о чем лучше и точнее расскажет страница wiki.

 

До новых встреч.


Вышел седьмой кандидат в релизы Gambas 3

   

Это последний кандидат в релизы Gambas3 перед выходом финального релиза, который запланирован на 31 декабря 2011.

Было исправлено множество ошибок и реализовано несколько новых возможностей, прежде всего это:

  • Новая тема подсветки синтаксиса в стилях редактора кода в IDE с названием «Gambas».
  • Новы контейнер «TabPanel», собственно это тот же контейнер TabStrip только с тонкими границами.
  • Почти закончена реализация возможности ожидания подключения к базе данных в компоненте gb.report.

Бенуа Минисини, автор среды разработки поздравляет всех с рождеством и обещает выпустить релиз под самый новый год 31 декабря 2011!


Gambas — вывод уведомлений libnotify на экран

   
вывод уведомления libnotify в Gambas

вывод уведомления libnotify в Gambas

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

В третьей версии Gambas стало возможным использовать систему межпроцессного взаимодействия D-Bus. При помощи этой системы запущенным процессам можно легко и быстро обмениваться «сообщениями», как бы «общаться». Раньше для этих целей использовались технологии вроде CORBA и подобные, но у них было два недостатка: они были очень медленные, и почти полностью отсутствовала стандартизация (в том плане, что например в KDE одна система «общения» процессов а в GNOME другая). В итоге на смену всему этому «мусору» пришла более продвинутая система D-Bus, и Gambas начиная с третьей версии поддерживает ее. D-Bus изначально написана для UNIX-систем, но есть также версия для Windows (что внушает надежды, ведь когда-нибудь и Gambas портируют в Windows!). В этой статье я не буду писать про D-Bus, и про сам компонент gb.dbus, так как это тема более широкая, и я постараюсь раскрыть ее в следующих постах. Здесь я просто расскажу, как в Gambas выводить на экран короткие уведомления (см. картинку). Когда-то на форуме я писал, как это сделать стандартными средствами системы (консольная программа notify-send, из пакета libnotify-bin), но это неинтересно, так как у пользователя нашей программы на Gambas может быть не установлен пакет libnotify-bin. Обратите внимание, что для вывода системных уведомлений методом, показанным ниже, к проекту Gambas должен быть подключен компонент gb.dbus, иначе работать не будет. Также напоминаю, что компонент gb.dbus есть только в Gambas начиная с третьей версии.

Салон Riviera Spa в Киеве предлагает новую услугу — шоколадное обертывание, при которой ваша кожа получит полезные вещества, станет мягкой и шелковистой. К тому же, как говорят люди знающие, это очень приятная процедура :)

Читать дальше »


Перехожу на Gambas 3

   

Для такого важного аспекта строительства, как строительные лицензии киев является вполне благоприятным местом. Будьте уверены, что все требования и формальности будут соблюдены в точном соответствии с законодательством. Это быстро, надежно, безопасно.

Привтствую всех читателей моего блога! Это первая новость за последнее время, и прошу прощение у моих читателей за долгое отсутствие. С одной стороны, ждал появления Gambas 3, а с другой — занимался своими делами.  Последние дни приводил все в порядок, обновил движки блога, форума, и даже сделал фотогалерею для моих читателей, где думаю размещать (надеюсь!) интересные фото, и полезные файлы. Очень соскучился по всем, и надеюсь на плодотворное и интересное общение. Блог снова ожил!

Из новшеств — теперь нужно как-то отделять информацию о второй и третьей версии Gambas, потому я отныне буду это указывать в тексте. Как правило проблем нет, и все вполне совместимо, но у третьей версии Gambas есть немало отличий в синтаксисе. Так что, желаю всем моим читателям добрых дней и приятных ночей, а на связи был Евгений Газзаев!