Итак, начнем с того, что данная картинка с эмулятора капец какая большая, самый высокий небоскреб будет упираться в верхний край монитора.
Для глаз это будет как-то не очень, на мой взгляд. Потому надо сделать панораму из повторных фрагментов и немного расширить картинку в высоту, например, до 2000 пикселей.
Моя исходная картинка разрешением 5000 на 2000
Вроде норм, но заставка помимо прокрутки вправо имеет 4 состояния анимации огней небоскребов и фар автомобилей.
Будем отталкиваться от огней небоскребов. Итак, 4 состояния соответствуют 4 уровням яркости красных маячков: Выключены, Яркость 1, Яркость 2, Яркость 3.
Это значит, что нужно получить 4 панорамы в формате BMP, потому что этот формат точно передает цвет.
Важно, чтобы кроме анимируемых объектов, положение всего остального было одинаковым. Из этих исходников будут вырезаться кадры.
На первый взгляд эти 4 панорамы не отличаются, но если увеличить и присмотреться (открыть в новом окне, изменить масштаб) - разница заметна.
Теперь о том, как проходит анимация детально:
1. Каждый кадр - это сдвиг картинки вправо на 1 пиксель
2. Каждые 10 кадров - это смена яркости огней
3. Цикл анимации огней Выключены - Яркость 1 - Яркость 2 - Яркость 3 - Яркость 2 - Яркость 1
Получается так, мы берем кадр с учётом пропорций своего монитора. У меня монитор квадратный 4:3, разрешение 1280х1024. Высоту картинки я поднял до 2000 пикселей, значит длинна кадра будет 2500.
Вот представьте, что при нарезке кадров, вдоль исходника (5000х2000) попиксельно движется рамка размером 2500х2000 и копирует этот фрагмент из исходника, сохраняя его под очередным номером.
Если совсем углубиться, то выглядит это так:
Пусть у нас есть исходники (панорамы) и01, и02, и03, и04. Кадры нужны размером 2500х2000.
Открыли в Paint исходник и пытаемся получить кадры из исходника и01 путём выделения прямоугольной области с последующим сохранением. Изменяться будет только координата по X, она будет постоянно увеличиваться на 1.
Кадр_001: и01, область (0, 0, 2499, 2000)
Кадр_002: и01, область (1, 0, 2500, 2000)
Кадр_003: и01, область (2, 0, 2501, 2000)
Кадр_004: и01, область (3, 0, 2502, 2000)
Кадр_005: и01, область (4, 0, 2503, 2000)
Кадр_006: и01, область (5, 0, 2504, 2000)
Кадр_007: и01, область (6, 0, 2505, 2000)
Кадр_008: и01, область (7, 0, 2506, 2000)
Кадр_009: и01, область (8, 0, 2507, 2000)
Кадр_010: и01, область (9, 0, 2508, 2000)
После 10 кадров происходит смена яркости огней. Это значит, что следующие 10 кадров будут взяты из следующего исходника - и02. И так далее, согласно циклу анимации огней по 10 кадров будет копироваться из и03, и04, и03, и02.
Координата Х области продолжает увеличиваться вне зависимости от исходников. Основным ориентиром в данном примере является самый высокий небоскреб. Как только последний кадр будет похож на первый - цикл замкнется.
Выяснить количество кадров не так уж сложно. Достаточно посчитать количество пикселей между 2 самыми высокими небоскребами.
Но возникает вопрос: Мне их больше тысячи нужно (1188 если быть точным). Это мне что теперь недели напролет сидеть вырезать в Paint эти долбанные кадры ???
Ответ: А вот тут всё гораздо проще. Я же говорил, что уже заморочился на эту тему, а значит решение есть!!!
На этом этапе нужно было всего лишь подготовить 4 панорамы-исходника.
Если первый этап не утомил - вперед ко второму, там будет еще веселее)))
2 Этап - Нарезка кадров с помощью Python
А я предупреждал, что будет весело ))))))))
Зачем нарезать вручную, когда можно это сделать программой, написанной в Python ? Но для этого нужно её установить. Проще это сделать, установив Anaconda (https://www.anaconda.com/products/individual).
А далее открываем Пуск и выбираем Jupyter Notebook
После откроется в браузере рабочая папка, где можно создавать свои проекты
Нажимаем New, выбираем Python 3 и открывается окно ввода кода:
В строку вводится код и запускается нажатием SHIFT + ENTER
Ну и конечно же сам код я предоставлю:
# импорт модуля Image
from PIL import Image
lf = 0
up = 0
rg = 2500
dw = 2000
delta = 0
files = ['f01.bmp','f02.bmp','f03.bmp','f04.bmp','f03.bmp','f02.bmp']
cropframe = []
for i in range(22):
for frame in range(6):
for copyframe in range(9):
# открыть изображение
path = 'D:/SOR/'+ files[frame]
if (delta < 10):
path2 = 'D:/SOR/Ready/'+ 'r000' + str(delta) + '.bmp'
if (delta < 100) and (delta > 9):
path2 = 'D:/SOR/Ready/'+ 'r00' + str(delta) + '.bmp'
if (delta < 1000) and (delta > 99):
path2 = 'D:/SOR/Ready/'+ 'r0' + str(delta) + '.bmp'
if (delta < 10000) and (delta > 999):
path2 = 'D:/SOR/Ready/'+ 'r' + str(delta) + '.bmp'
cropframe.append(delta)
cropframe.append(up)
cropframe.append(rg)
cropframe.append(dw)
cropreg = tuple(cropframe)
#print(cropreg)
Image1 = Image.open(path)
# обрезать изображение
croppedIm = Image1.crop(cropreg) #box_tuple- [left, up, right, bottom] of the image to crop
#croppedIm = Image1.crop((0,0,2500,2000))
croppedIm.save(path2)
delta = delta + 1
rg = rg + 1
cropreg = tuple()
cropframe = []
print('THE END')
Чтобы код корректно отрабатывал, нужно привести его к такому виду (с отступами) #comment_281497811
Давайте разберемся немного, какие цифры менять:
1. rg = 2500 и dw = 2000 - это длинна и ширина кадра
2. files = ['f01.bmp','f02.bmp','f03.bmp','f04.bmp','f03.bmp','f02.bmp'] - это массив имен файлов, которые описывают полный цикл анимации огней. Сами же файлы - это исходники, из которых будут вырезаться кадры. Рекомендуется переименовать файлы панорам в соответствии с приведенной строкой, т.е. f01.bmp, f02.bmp, f03.bmp, f04.bmp или заменить в тексте программы на свои имена.
3. В строке for i in range(22): нужно заменить число, чтобы получить нужное количество кадров. Например, требуется создать 1528 кадров, просто делим это количество на 60, забираем целую часть и увеличиваем на 1. То есть 1528 / 60 = 25,4 --> 25 + 1 = 26. Именно это число надо вписать в скобки, for i in range(26):
Итоговое количество созданных кадров не должно быть меньше 1528.
В итоге будет создано 26 * 60 = 1560 кадров. Лишнее всегда можно удалить.
4. path = 'D:/SOR/'+ files[frame] - это строка, которая указывает путь к файлу исходнику.
В кавычках указан путь к папке, где лежат 4 исходника, в данном примере - это папка SOR на диске D.
Здесь нужно только указать свою папку с исходниками.
5. path2 = 'D:/SOR/Ready/'+ 'r000' + str(delta) + '.bmp' - это строка, которая указывает путь сохранения кадра. В данном примере - это папка Ready, которая лежит в папке SOR на диске D.
Здесь нужно только указать свою папку для сохранения готовых кадров.
Вот так выглядит папка D:/SOR
А в процессе выполнения программы можно перейти в папку Ready и увидеть, как создаются кадры. Как только будет создано нужное количество - программа прекратит выполнение.
Всего 2 минуты нужно было программе чтобы создать 1188 кадров !!!
Дальше ещё веселее - Монтаж видео !!! Готовы ???
По сути это короткий этап, но тоже мозговыносящий. А всё потому, что нужно найти нормальный видеоредактор с нормальным таймером. У некоторых редакторов 1 секунда - это 29 мс или фреймов, не знаю точно. У других 1 секунда - это 999 мс.
В общем надо понимать, сколько кадров в секунду будет у нас 25 или 30.
Я остановился на программе Movavi Video Editor Plus. Всё просто открываем программу, импортируем картинки (ага, ЩАС !!!).
Весь процесс затянется, потому что импортировать более 1000 картинок и не малых размеров - процесс долгий.
Потом их все ещё перетаскивать на временную шкалу. Если вдруг у кого комп начнет кипеть - советую мелкими партиями импортировать и делать из них видео-фрагменты, которые потом соединить в одно большое видео.
Всем картинкам на временной шкале нужно задать длительность 25 мс
Теперь осталось вывести это в видеофайл. У меня это MP4
Завершающий этап. Здесь нам поможет прога PUSH VIdeo Wallpaper
Всё просто: Нажимаем плюсик - Выбираем видео - Сворачиваем окно в трей (не закрываем) - И....
Данная прога способна также воспроизводить и звук если надо или если он в видео встроен.
И еще она содержит скринсейвер, который настраивается отдельно в соответствующем разделе настроек винды (персонализация - темы - параметры темы - заставка), что позволяет поставить любимое видео на заставку при длительном простое компа.
Вот и всё. Пользуйтесь, если кому интересно )))
P.S. Если есть более простые способы добиться той же цели - буду рад узнать )))