gambas.pro
Спешу сообщить хорошую новоcть, приобретен домен gambas.pro, где теперь и будет размещатся блог и форум по языку Gmabas. Данный сайт будет ещё доступен некоторое время, для информирования пользователей.
Спешу сообщить хорошую новоcть, приобретен домен gambas.pro, где теперь и будет размещатся блог и форум по языку Gmabas. Данный сайт будет ещё доступен некоторое время, для информирования пользователей.
Продолжая тему работы с Изображениями в это статье я приведу пример, как можно вывести несколько изображений на панель по подобию работы таких программ, как ShotWell и DigiKam.
Для работы разместим на форме два элемента: ScrollView и ButtonBox. В ScrollView мы будем выводить изображения, а по кнопке ButtonBox откроем папку с фотографиями.
Для ScrollView1 нужно задать свойство Arrangement = Row — это чтобы наши изображения при выводе располагались рядами.
Вот что у нас получится в итоге:

Привожу полный код программы с комментариями:
Dim sFile As String Dialog.Path = "/home" 'Задаем директорию в которой будет открыт диалог выбора mFiles = Dir(Dialog.Path, "*.jpg", 1) 'Оператор Dir возвращает массив файлов из директории по заданому шаблону For Each sFile In mFiles 'начинаем цикл по массиву файлов - наших изображений hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea Draw.Begin(hArea) 'Выводим изображение
Public Sub ButtonBoxOpenFile_Click()
Dim hImage As Image
Dim hArea As DrawingArea
Dim SizeArea As Integer = 100
Dim mFiles As String
If Dialog.SelectDirectory() Then Return 'Инициируем диалог выбора директории
ButtonBoxOpenFile.Text = Dialog.Path
hImage = Image.Load(Dialog.Path & "/" & sFile) 'Загружаем изображение в объект hImage
hImage = hImage.Stretch(SizeArea, SizeArea) 'Уменьшаем изображение до размера эскиза 100*100, чтобы вошло несколько изображений на панель
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом
hArea.Cached = True 'Задаем свойство кеширования
hArea.Border = 3 'Устанавливаем тип границы
hArea.Width = SizeArea 'Задаем размер облости вывода изображения
hArea.Height = SizeArea
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
Вот таким кодом мы просто рассчитаем ширину и высоту изображения и сдвиг его относительно вертикали и горизонтали.
Весь код последнего варианта выглядит так: Dim sFile As String Dim K As Float Dialog.Path = "/home" 'Задаем директорию в которой будет открыт диалог выбора mFiles = Dir(Dialog.Path, "*.jpg", 1) 'Оператор Dir возвращает массив файлов из директории по заданому шаблону For Each sFile In mFiles 'начинаем цикл по массиву файлов - наших изображений If hImage.Height > hImage.Width Then hImage = hImage.Stretch(Width, Height) 'Уменьшаем изображение до размера эскиза 100*100, чтобы вошло несколько изображений на панель hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea Draw.Begin(hArea) 'Выводим изображение
Public Sub ButtonBoxOpenFile_Click()
Dim hImage As Image
Dim hArea As DrawingArea
Dim SizeArea As Integer = 100
Dim mFiles As String
Dim Height, Width, dH, dW As Integer
If Dialog.SelectDirectory() Then Return 'Инициируем диалог выбора директории
ButtonBoxOpenFile.Text = Dialog.Path
hImage = Image.Load(Dialog.Path & "/" & sFile) 'Загружаем изображение в объект hImage
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
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом
hArea.Cached = True 'Задаем свойство кеширования
hArea.Border = 3 'Устанавливаем тип границы
hArea.Width = SizeArea 'Задаем размер облости вывода изображения
hArea.Height = SizeArea
Draw.FillRect(0, 0, SizeArea, SizeArea, Color.Gray) 'Здесь мы просто заполним всю область серым цветом
Draw.Image(hImage, dW, dH, Width, Height) 'выведем со сдвигом
Draw.End
Next
End
Проект можно скачать отсюда: mArea
До новых встреч!
Озадачился я тут некоторой медлительностью Гамбаса и решил сравнить с аналогичными опирациями в 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 и выводе изображений на форму.
По моему эта тема ещё не была освещена в нашем блоге.
Реализуем простой пример:
Откроем файл с изображением и выведем его на форму в контейнер «DrawingArea», при этом изменим размер изображения чтобы оно помещалось в DrawingArea полностью.
А после изменим яркость.
Начнём.
Создадим новый проект выбрав опцию «Обработка изображений». Т.е. в проекте должны быть подключены компоненты gb.image и gb.image.effect.
Разместим на форме контрол контейнер DrawingArea с именем DrawingArea1.
Изменим свойство Border на Plain, чтобы можно было видеть границы изображения.
И изменим свойство Cashed на True. Это необходимо иначе будет возникать ошибка!
Ниже разместим контрол «ButtonBox» с именем ButtonBoxOpenFile. Кстате это новый контрол в версии 3. Он объединяет в себе контролы TextBox и Button. Очень удобен для реализации всевозможных выборов, позволяет и осуществлять выбор нажатием и выводить результат выбора в поле ввода.

Зададим глобальную переменную, объект в котором и будет хранится наше изображение.
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.
До новых встреч.
Друзья, поздравляю всех с наступающим Новым годом! Успехов вам в работе, профессиональном развитии и конечно пусть будет время и силы на реализацию всех задумок и проектов!
А также поздравляю с входом релиза Gambas3!
Benoît Minisini, как и обещал выпустил сегодня релиз Gambas3. Исходники доступны на сайте проекта:
http://gambas.sourceforge.net/en/main.html
Как всегда бвло исправлено множество ошибок.
А также закрыты две важные «дыры»:
И в последний момент были реализованы следующие новшества:
Продолжая рассказ про новое в версии Gambas 3 в этой статье мы коснёмся компонентов, которые появились или изменились в новой версии.
Компоненты в Gambas 3 претерпели изменения, но не очень существенные.
Давайте для начала сравним количество пакетов Gambas версии 2 и Gambas версии 3 на примере дистрибутива Fedora 16.
Версия 2 содержала 48 пакетов, а версия 3 уже 53 пакета. Незначительный, но уверенный привес в 5 пакетов, а значит среда разработки получила дополнительные возможности, что не может не радовать.
Теперь, какие же компоненты добавилось в новой версии:
Копоненты gb.qt в версии 3 теперь обозначены как gb.qt4 и добавился один новый компонент из этой группы:
Следующие компоненты ушли из новой версии или точнее были заменены другими:
Вместо двух gb.gtk теперь один компонент gb.gtk.
Вместо них теперь компоненты gb.qt4. Очень хорошо, что ушли компоненты привязанные к kde, т.к. не во всех дистрибутивах были собраны пакеты с этими компонентами.
Вот краткий обзор компонентов, которые появились в новой версии Gambas 3.
До встречи!