Внимание у нас новый домен Gambas.pro

   

gambas.pro

Спешу сообщить хорошую новоcть, приобретен домен gambas.pro, где теперь и будет размещатся блог и форум по языку Gmabas. Данный сайт будет ещё доступен некоторое время, для информирования пользователей.


Вывод фотографий на панель. Динамическое создание объектов в 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!

   

Друзья, поздравляю всех с наступающим Новым годом! Успехов вам в работе, профессиональном развитии и конечно пусть будет время и силы на реализацию всех задумок и проектов!

 

А также поздравляю с входом релиза Gambas3!

Benoît Minisini, как и обещал выпустил сегодня релиз Gambas3. Исходники доступны на сайте проекта:

http://gambas.sourceforge.net/en/main.html

 

 

Как всегда бвло исправлено множество ошибок.

А также закрыты две важные «дыры»:

  • Строковый алгоритм хеширования был реализован через random.
  • В IDE нельзя было получить версию программы. Теперь версия будет браться из текстового файла расположенного в родительском каталоге проекта.

И в последний момент были реализованы следующие новшества:

  • Корректное использование математических функций Glibc.
  • Улучшен вывод цифр с плавающей запятой.
  • Обновлены переводы: французский, чешский и Catalan.

 


Новое в версии 3. Компоненты.

   

Продолжая рассказ про новое в версии Gambas 3 в этой статье мы коснёмся компонентов, которые появились или изменились в новой версии.

Отличия по пакетам

Компоненты в Gambas 3 претерпели изменения, но не очень существенные.

Давайте для начала сравним количество пакетов Gambas версии 2 и Gambas версии 3 на примере дистрибутива Fedora 16.

Версия 2 содержала 48 пакетов, а версия 3 уже 53 пакета. Незначительный, но уверенный привес в 5 пакетов, а значит среда разработки получила дополнительные возможности, что не может не радовать.

Компоненты

Теперь, какие же компоненты добавилось в новой версии:

  • gb.cairo — является 2D графической библиотеки с поддержкой нескольких форматов вывода: изображения, PDF, PS или SVG файлов.
    Cairo позволяет использовать для вывода изображений аппаратные средства ускорения.
  • gb.dbus — компонент для работы с D-Bus. Позволяет отправлять и принимать сигналы от приложений подключённых к D-Bus.
  • gb.eval.highlight — компонент является дополнением к компоненту gd. eval и содержит ряд полезных функций для анализа, выделения и расскраски строк кода в Gambas.
  • gb.image.imlib — компонент добавляет методы обработки изображений из библиотеки imlib2.
  • gb.image.io — компонент позволяет загружать изображения с диска, и сохранить их на диск.
  • gb.image.effect — компонент фильтрации изображений, как видно из описания, но в хелпе по нему никакой информации пока нет.
  • gb.opengl.glsl — компонент для управления OpenGL шейдерами (OpenGL Shading Language).
  • gb.opengl.glu — компонент предоставляющий набор GL утилит GLU библиотеки, как набор подпрограмм в дополнение к системе OpenGL.

Копоненты gb.qt в версии 3 теперь обозначены как gb.qt4 и добавился один новый компонент из этой группы:

  • gb.qt4.webkit — компонент позволяет встроить браузер WebKit в разрабатываемое приложение. Данный компонент очень активно используется и в самой среде Gambas 3 для отображения различной информации, описаний и хелпа.
  • gb.signal — компанент для перехвата сигналов POSIX.

Следующие компоненты ушли из новой версии или точнее были заменены другими:

  • gb.gtk.ext
  • gb.gtk.svg

Вместо двух gb.gtk теперь один компонент gb.gtk.

  • gb.qt.kde
  • gb.qt.kde.ext

Вместо них теперь компоненты gb.qt4. Очень хорошо, что ушли компоненты привязанные к kde, т.к. не во всех дистрибутивах были собраны пакеты с этими компонентами.

Вот краткий обзор компонентов, которые появились в новой версии Gambas 3.

До встречи!