Программа показывает автоматическое слайд-шоу с возможностью ручного управления показом. Слайды представляют собой картинки из jpg или png файлов, которые могут быть размещены на локальном компьютере или в интернете. Одновременно можно запустить фоновую музыку из midi файлов (с расширением mid). Программа является проигрывателем файлов по списку (протоколу), который автоматически считывается из указанного файла. Этот файл может находиться где угодно на компьютере или в интернете. Этот файл будем называть файлом протокола. Пользователь должен сам набить этот файл в любом текстовом редакторе, самый лучший редактор vkNotepad.jar. В файле протокола кроме имен файлов картинок и музыки должны содержаться параметры показа, о чем написано ниже.
Файл протокола должен быть записан по определенной системе, а именно:
В первой строке
должно быть набито имя файла с фоновой музыкой и через знак '|' (вертикальная черта) пять чисел, разделенных пробелами. Первое число - номер картинки, к которой будет произведен возврат после показа всех картинок из списка. Этот номер не обязательно должен указывать на первую картинку. Далее пара чисел указывает размер анимационного окна в пикселах. Все картинки будут показаны в этом размере. Если их размер больше, то они будут обрезаны. Если меньше, то они будут располагаться в соответствии с параметрами окна. Размер анимационного окна можно задавать произвольным, хоть на весь экран, при этом картинки будут показываться на сером фоне. Однако следует помнить, что каждая новая картинка просто накладывается на предыдущую, поэтому если размер картинок разный, то большие картинки будут видны по краям маленьких. Это можно использовать, но это в любом случае надо учитывать
Следующая пара чисел показывает смещение левого верхнего угла окна от левого верхнего угла экрана. После запуска окно можно перемещать по экрану обычным образом, так что смещение задает только стартовое положение окна. Заданные числа корректируются таким образом, что как размеры окна так и смещение не должны уводить окно с экрана. Если задать очень большие размеры окна, то оно будет автоматически обрезано размерами экрана, а смещение сделано нулевым. При отрицательных значениях смещения окно будет расположено в центре экрана.
Для файла фоновой музыки нужно использовать MIDI (mid) файл. Встроенный проигрыватель программы не играет mp3 файлы, а файлы с расширением wav, au, aif имеют очень большой размер. Все файлы задаются либо своим URL адресом, либо простым именем со знаком ($) перед именем. URL адрес - это полный адрес файла либо в интернете, либо на локальном компьютере. Вот примеры правильного задания адресов файлов:
http://kohnvict.narod.ru/midi/In-Grid-In-Tango.mid
File:d:/SS/1/tango.mid
В первом примере файл находится в интернете на моем сайте в папке /midi/. Я буду постепенно выкладывать туда коллекцию таких файлов, которые можно будет использовать для фоновой музыки. Во втором примере файл находится на локальном компьютере. В этом случае адрес должен начинаться словом (File:) а затем должен быть указан полный путь к файлу на компьютере.
В следующих строках должны быть указаны имена файлов с картинками, но после некоторых из них могут быть строки, предписывающие поставить на картинку текст (см. ниже). В строках с файлами картинок перед именем файла с картинкой первым символом должен быть набит символ "#", допустимые форматы: GIF, JPG, PNG. Сразу за именем файла через знак '|' записывается время показа данной картинки в сантисекундах (0.01 сек). В этой же строке можно указать второе число через пробел, которое будет определять режим перехода от предыдущей картинки к новой картинке. Сейчас работают 12 режимов перехода, задаваемых цифрами от 1 до 12. Время перехода 0.35 сек для первых 6 режимов и немного больше для последних 6 режимов (зависит от быстродействия процессора). Все режимы перехода описаны ниже в таблице
01 -- схлопывание старой картинки в центре.
02 -- вырастание новой картинки из центра
03 -- вырастание новой картинки из левого верхнего угла
04 -- вырастание новой картинки из левого нижнего угла.
05 -- новая картинка падает сверху вниз
06 -- новая картинка наползает слева направо
07 -- новая картинка смешивается со старой и ее вес все время растет от 0 до 1
08 -- старая картинка теряетяркость, затем новая картинка наращивает яркость
09 -- новая картинка выталкивает старую слева
10 -- новая картинка выталкивает старую справа
11 -- новая картинка выталкивает старую сверху
12 -- новая картинка выталкивает старую снизу
За режимом мгновенного показа зарезервирована цифра 0, во всех остальных случаях тоже будет мгновенный показа, но через черный экран (пока не будет исправлено). Необходимо отметить одно ОЧЕНЬ ВАЖНОЕ ограничение. Переходы с 2-го по 6-й делаются с использованием только новой картинки, размер которой может быть любым. А переходы 1-й и с 7-го по 12-й делаются с учетом как старой, так и новой картинки. В этом случае размеры обоих картинок ДОЛЖНЫ СОВПАДАТЬ. Если этого не будет, то программа фатально останавливается, пока я не исправлю этот недосмотр. Поэтому, еcли новая картинка имеет другой размер по сравнению со старой, то можно задавать только переходы 0,2-6.
При необходимости в этой же строке можно указать еще пару чисел, как положительных, так и отрицательных. Эти два числа, третье и четвертое, задают смещения центра картинки из центра анимационного окна. Если они не указаны, то все картинки размещаются в центре. Если указаны смещения, то картинки будут смещены. Смещения нужно задавать индивидуально для каждой картинки. При задании смещения правило такое же, разрешенные переходы 0,2-6.
Это еще не все. За смещениями можно указать еще тройку чисел: пятое, шестое и седьмое. Эти числа регулируют динамику изменения картинки в процессе показа, которая достигается автоматическим показом новых кадров, либо полученных из основного масштабированием, либо показываемых со смещением, что и создает эффект динамики. Пятое число указывает время смены кадров в сантисекундах (0.01 сек). Если оно равно нулю - ничего не происходит. Шестое число указывает число пикселей, которые используются при изменении. Оно может быть как положительным так и отрицательным. Седьмое число может быть равным 0, 1 или 2.
Если седьмое число равно 0 или отсутствует, то происходит изменение размеров картинки. В этом случае шестое число задает число пикселей, на которое будет изменен вертикальный размер картинки за один раз. Надо иметь в виду, что время указывается без учета времени на перерасчет картинки. Это дополнительное время может быть значительным, поэтому надо вносить поправку в длительность показа в сторону ее уменьшения. Оптимизация параметров может быть проведена эмпирическим путем. Но есть одно правило. Число кадров, которые будут показаны точно равно отношению общего времени задержки на время показа одного кадра. Сделать масштабирование плавным не удается из-за довольно большого времени пересчета картинки. Кроме того, новая картинка может появиться с небольшим смещением, что создает эффект дрожания. По этой причине разумно менять размер картинки сразу на 5 пикселей или больше, но пореже. При этом кадры будут меняться рывком, но динамика все же останется.
Если седьмое число равно 1, то картинка будет двигаться слева направо или справа налево в зависимости от знака смещения. Для правильного показа исходная картинка должна иметь размер по горизонтали больше чем размер окна на величину S*N где S - абсолютная величина однократного смещения (параметр 6 без знака), а N - полное число кадров как отношение полного времени показа T к времени показа одной картинки D. Время показа одной картинки D можно ставить минимальным, то есть 1 и однократное смещение S тоже можно ставить минимальным, то есть 1. Тогда если горизонтальный размер окна равен 800, то размер картинки должен быть равен 800+T. Более того, исходно картинка должна быть поставлена со смещением на T/2 в другую сторону. При заданных размерах окна и картинки замедлить показ вдвое можно задав T и D в два раза больше одновременно.
Если седьмое число равно 2, то картинка будет двигаться сверху вниз или снизу вверх в зависимости от знака смещения. Все остальное должно быть так же как в предыдущем случае, только по вертикали. При использовании указанных выше режимов переходы лучше всего не задавать совсем.
Картинки могут иметь произвольный размер и исходно они показываются как есть, без масштабирования. Поэтому очень большие картинки будут обрезаны если их не масштабировать заранее. Как уже говорилось, если размер картинки больше окна, то показывается та часть, которая соответствует окну, то есть как бы фрагмент. Поэтому нет смысла включать в файл те части картинки, которые не будут показаны, лучше ее промасштабировать или вырезать. Для масштабирования картинок и вырезания фрагментов можно использовать все тот же мой редактор vkNotepad, либо acl-программы данной версии vkACL.
Важно также помнить, что вновь показываемая картинка накладывается на предыдущую и если она имеет меньший размер, то предыдущая картинка остается частично видна.
В некоторых строках можно задать инструкцию установки на предыдущую картинку текста без фона, то есть как бы в прозрачном режиме. На самом деле текст просто рисуется на картинке. Чтобы заказать такой режим нужно после строки с нужной картинкой поставить строки специального вида. Эти строки могут присутствовать в любом числе для каждой строки текста отдельно. Итак, чтобы поставить текст на картинку надо набрать строку следующего типа
text=xxxxxxxxx| T S X Y R G B K
Здесь вместо xxxxx должен быть сам текст, который будет показан. Можно задавать как английский, так и русский текст в win-1251 кодировке. Буквами обозначены целые числа - параметры текста, а именно:
T - время показа текста в сантисекундах (0.01 сек)
S - размер фонта в пикселах
X Y - координаты левого нижнего угла текста в пикселах
R G B - параметры красного зеленого и синего для цвета текста в диапазоне от 0 до 255
K - тип текста, допустимые значения 0 - обычный, 1 - жирный, 2 - курсив, 3 - жирный курсив
Шрифт текста зафиксирован как "Sans Serif" и не может быть изменен.
Каждая новая строка добавляет на картинку новый текст не убирая старый. Так можно создать эффект постепенного возникновения текста, строка за строкой. Чтобы начать сначала, надо снова нарисовать картинку.
Важное замечание - текст ставится на картинку, а не на анимационное окно. Поэтому если размеры картинки будут больше размеров анимационного окна, то координаты текста могут не соответсвовать окну и будут смещены. Еще одно замечание, достаточно очевидное, но все же. Текст ставится только после того, как анимация заказанная на картинку полностью закончится. То есть если заказано движение картинки то оно все закончится и после этого только возникнет текст. Причина в том, что программа не читает новую инструкцию, пока не выполнит предыдущую полностью. Поэтому не ставьте текст на движущиеся картинки.
В программе дается образец файла протокола для показа картинок из интернета и его использование в живом демонстрационном примере. Более фасонные протоколы буду выставлены позднее.
В процессе показа картинок в стационарном режиме (не во время перехода) программа ждет сигналов от клавиатуры и может менять свою работу в зависимости от этих сигналов. Так если заказана слишком большая пауза, то можно принудительно реализовать переход к новой картинке, а можно даже сделать возврат к предыдущей картинке. Ниже дан список всех клавиш, которые влияют на процесс
. . [Esc] -- полный выход из программы
. . [Enter] -- принудительная остановка показа, программа выключает фоновую
. . . . музыку и ждет повторного нажатия клавиши, после чего фоновая музыка
. . . . включается с самого начала и программа переходит на следующий кадр.
. . [Стрелка наверх] -- возврат на один кадр назад
. . [Стрелка влево] -- возврат на два кадра назад
. . [Backspace] -- возврат на три кадра назад
. . [Page Up] -- возврат на четыре кадра назад
. . [Page Down] -- движение вперед на пять кадров
. . [C] -- отмена фоновой музыки
. . [O] -- включение фоновой музыки после отмены
. . [Home] -- переход в самое начало
. . [End] -- переход в самый конец, после чего можно крутить назад
. . [Любая другая клавиша] -- движение вперед на один кадр
Можно сгенерировать и выставить картинку с указанным выше текстом сразу на двух языках, как это сделано в примере.