Выводим картинку с помощью lua

Разработка скриптов на lua. Создание виджетов, диалогов и т.д.
Ответить
Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Выводим картинку с помощью lua

Сообщение olgmen » 17 янв 2014, 19:09

Для вывода картинок в формате png сначала необходимо создать имидж картинки, для этого имеется команда

image = cairo.ImageSurface.create_from_png(imagename)

с помощью этой команды определяются размеры картинки, и теперь приводим картинку к размеру который нам необходим. Например сделаем картинку размером 256х256

cr:scale(256 / image.width, 256 / image.height)

теперь устанавливаем картинку

cr:set_source_surface(image, 0, 0)

Здесь 0,0 - это координаты верхнего левого угла картинки

и выводим на экран

cr:paint()

Здесь есть несколько примечаний.

imagename - должен содержать полный путь к картинке и полное её название, конечно можно сделать это с переменной

local imagename = /путь/до/картинки/картинка.png

картинку можно масштабировать как угодно, но если размер выводимой картинки будет больше оригинала, то возможно снижение резкости картинки.

Картинка выводится с начальными координатами x = 0, y = 0, для смещения картинки в нужное место лучше воспользоваться командой

cr:translate(x1, y1)

Всё вместе это выглядит примерно так

local imagename = "/home/olgmen/images/kartinka.png"

local image = cairo.ImageSurface.create_from_png(imagename)
cr:translate(25, 25)
cr:scale(256 / image.width, 256 / image.height)
cr:set_source_surface(image, 0, 0)
cr:paint()


Изображение

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

Для этого надо просто добавить команду вывода окружности и команду которая запрещает отрисовку окружности

cr:arc(128,128,75,0, 2*math.pi)
cr:clip()
local image = cairo.ImageSurface.create_from_png(imagename)
cr:translate(25, 25)
cr:scale(256 / image.width, 256 / image.height)
cr:set_source_surface(image, 0, 0)
cr:paint()


Изображение

Как говорится в рекламах, и это ещё не всё, можно повернуть картинку на любой градус

cr:arc(128,128,77,0, 2*math.pi)
cr:clip()

local image = cairo.ImageSurface.create_from_png(imagename)
cr:translate(128, 128)
cr:rotate(math.rad(45))
cr:scale(256 / image.width, 256 / image.height)
cr:translate(-image.width / 2, -image.height / 2)
cr:set_source_surface(image, 0, 0)
cr:paint()

Изображение

И на последнее, вывод нескольких изображений одной картинки, типа кафельной плитки

local image = cairo.ImageSurface.create_from_png(imagename)

local pattern = cairo.Pattern.create_for_surface(image)
pattern.extend = 'REPEAT'

cr:translate(128, 128)
cr:rotate(math.rad(45))
cr:scale(1 / math.sqrt(2), 1 / math.sqrt(2))
cr:translate(-128, -128)

pattern.matrix = cairo.Matrix.create_scale(image.width / 256 * 3,
image.height / 256 * 3)

cr.source = pattern

cr:rectangle(0, 0, 256, 256)
cr:fill()


Здесь в строке

pattern.matrix = cairo.Matrix.create_scale(image.width / 256 * 3, image.height / 256 * 3)

цифра 3, количество выводимых копий картинки

Изображение

А что делать, если нет картинки в формате png, а есть в формате jpg. Кстати, такую картинку я и выводил, не нашел подходящей в нужном формате. Для перевода картинки из формата png в формат png даем команду на lua

os.execute("convert /путь/к/картинке/картинка.jpg /tmp/kartinka.png")

я использую /tmp для хранения промежуточных данных, ну и картинок в том числе.

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

os.execute("convert /home/olgmen/images/3.jpg /tmp/kartinka.png")

local imagename = "/tmp/kartinka.png"
local image = cairo.ImageSurface.create_from_png(imagename)

local pattern = cairo.Pattern.create_for_surface(image)
pattern.extend = 'REPEAT'

cr:translate(128, 128)
cr:rotate(math.rad(45))
cr:scale(1 / math.sqrt(2), 1 / math.sqrt(2))
cr:translate(-128, -128)

pattern.matrix = cairo.Matrix.create_scale(image.width / 256 * 3,
image.height / 256 * 3)
cr.source = pattern

cr:rectangle(0, 0, 256, 256)
cr:fill()
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость