Анімована осцилограма.
Захотілося мені дві осцилограми з різним часом сну в описові прикладу scmRTOS замінити на «живу» картинку. Спочатку, звісно, знову підключив плату до логічного аналізатора осцилографа Rigol-1062CD. Для 2-секундного ролика десь двох десятків кадрів має бути досить, але втрапити точно в потрібні моменти важко, тому я назнімав картинок з запасом. Після відбору та сортування в потрібному порядку файли зображень отримали назви від s01.png
до s22.png
.
А далі… Раніше для одиночних осцилограм я вже зробив в редакторі векторної графіки InkScape файл з шаром текстових маркерів та шаром зображення. В цей файл вставляв картинки, совав маркери та зводив шари в один файл для сайту. Але тут треба зробити те ж саме для двох десятків картинок, причому з однаковими написами, маркери вже не соваючи. Механічна робота. Вирішив автоматизувати.
Отже, маємо картинки розміром 320×234 такого типу:
Як бачимо, в осцилографі Rigol підписи D0…D5 до сигналів починаються від лівого краю зображення. На індикаторі осцилографа це виглядає нормально, бо ще лівіше йде темне тло неробочої частини індикатора. На сторінці з білим тлом літери D виглядають не дуже гарно. Тому в картинці написів є ще тонка вертикальна лінія, зроблена кольором рамки осцилограми.
Розмір картинки підписів 400×234, тобто перед її накладанням осцилограму треба розширити вліво на 80 пікселів. Реальний командний рядок bash виглядав так:
Його незручно роздивлятися, та оболонка командного рядка в Linux дозволяє безпосередньо перед переведенням рядка дати символ \
(«backslash») для продовження набору команди в новому рядку. Запрошення системи в таких додаткових рядках складається з одного символу >
Так і зробимо для зручності аналізу:
1 2 3 4 5 6 | $ for f in s*png ; do \ > convert -background white \ > $f -extent 400x234-80 \ > p2-p3-markers.png \ > -layers merge m$f \ > ; done |
- Запускаємо цикл зі зіміною
f
по всіх файлах з іменами видуs*png
. В даному каталозі такі імена мають лише файли для майбутньої осцилограми. - Починається тіло циклу. Тут воно складається з виклику однієї програми, утиліти convert з пакету ImageMagic. Задаємо фон білого кольору.
- Беремо зображення по змінній циклу
$f
і розширюємо його до розміру 400×234, зсуваючи це розширення по горизонталі на «мінус 80», тобто вліво. - Беремо зображення з маркерами. Це зображення лежатиме шаром вище, так само, як при відкриванні зображення в новому шарі в програмах InkScape GIMP чи PhotoShop.
- Даємо команду звести шари. Оскільки робити більше нічого, вказуємо вихідний файл. Ім’я вихідного файлу утворюємо додавання літери m на початку імені вхідного файлу.
- Кінець циклу. В останньому рядку символ маскування не набираємо
Всі картинки набрали такого вигляду:
Тепер вони мають імена від ms01.png
до ms22.png
. Залишилося однією короткою командою зібрати їх в анімований GIF.
Знову ж таки, тепер лише для спрощення опису елементів команди, розіб́’ємо на кілька рядків.
1 2 3 4 | $ convert ms*png \ > -layers optimize \ > -delay 95x1000 \ > p2-p3-live.gif |
- Викликаємо ту ж саму програму, але тепер без циклу. Замість зразка імені
ms*png
командний процесор підставить послідовно в алфавітному порядку імена всіх файлів, які розпізнаються зразком. Файли відкриються в послідовних шарах. - Звести шари з оптимізацією. При цьому виділяється спільна частина всіх зображень і наступні шари робляться з прозорістю там, де вони співпаадють з основою. Оскільки на цих осцилограмах доволі велика частина зображення статична, вихідний файл буде мати в кілька разів менший розмір.
- Встановлюємо затримку між кадрами 95 тіків при 1000 тіків на секунду, тобто 95 мілісекунд.
- Ім’я файлу, в який програма має записати анімовану картинку.
І виходить ось таке:
p.s. Якщо використовувати ImageMagick для Windows, то перший командний рядок буде таким:
А другий не поміняється.
Класно, *дуже* класно!-)
ps. “Для віндовз” мені чомусь доводилося казати “for %f in (s*.png) do …” — брати у дужки… Наче… Бо казало “непредвиденное появление…”.
Точно! Дякую, виправляю.
Бач, як швидко забувається 😉
Особливо коли “зкопіпастити” і підредагувати хочеться, а не написати з нуля так, як воно має бути.