Анімована осцилограма.

Захотілося мені дві осцилограми з різним часом сну в описові прикладу scmRTOS замінити на «живу» картинку. Спочатку, звісно, знову підключив плату до логічного аналізатора осцилографа Rigol-1062CD. Для 2-секундного ролика десь двох десятків кадрів має бути досить, але втрапити точно в потрібні моменти важко, тому я назнімав картинок з запасом. Після відбору та сортування в потрібному порядку файли зображень отримали назви від s01.png до s22.png.

А далі… Раніше для одиночних осцилограм я вже зробив в редакторі векторної графіки InkScape файл з шаром текстових маркерів та шаром зображення. В цей файл вставляв картинки, совав маркери та зводив шари в один файл для сайту. Але тут треба зробити те ж саме для двох десятків картинок, причому з однаковими написами, маркери вже не соваючи. Механічна робота. Вирішив автоматизувати.

Отже, маємо картинки розміром 320×234 такого типу:

single RIGOL LA oscillogram

Як бачимо, в осцилографі Rigol підписи D0…D5 до сигналів починаються від лівого краю зображення. На індикаторі осцилографа це виглядає нормально, бо ще лівіше йде темне тло неробочої частини індикатора. На сторінці з білим тлом літери D виглядають не дуже гарно. Тому в картинці написів є ще тонка вертикальна лінія, зроблена кольором рамки осцилограми.

labels for oscillogram

Розмір картинки підписів 400×234, тобто перед її накладанням осцилограму треба розширити вліво на 80 пікселів. Реальний командний рядок bash виглядав так:

for f in s*png ; do convert -background white $f -extent 400x234-80 p2-p3-markers.png -layers merge m$f ; done

Його незручно роздивлятися, та оболонка командного рядка в 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
  1. Запускаємо цикл зі зіміною f по всіх файлах з іменами виду s*png. В даному каталозі такі імена мають лише файли для майбутньої осцилограми.
  2. Починається тіло циклу. Тут воно складається з виклику однієї програми, утиліти convert з пакету ImageMagic. Задаємо фон білого кольору.
  3. Беремо зображення по змінній циклу $f і розширюємо його до розміру 400×234, зсуваючи це розширення по горизонталі на «мінус 80», тобто вліво.
  4. Беремо зображення з маркерами. Це зображення лежатиме шаром вище, так само, як при відкриванні зображення в новому шарі в програмах InkScape GIMP чи PhotoShop.
  5. Даємо команду звести шари. Оскільки робити більше нічого, вказуємо вихідний файл. Ім’я вихідного файлу утворюємо додавання літери m на початку імені вхідного файлу.
  6. Кінець циклу. В останньому рядку символ маскування не набираємо

Всі картинки набрали такого вигляду:

oscillogram with labels

Тепер вони мають імена від ms01.png до ms22.png. Залишилося однією короткою командою зібрати їх в анімований GIF.

convert ms*png -layers optimize -delay 95x1000 p2-p3-live.gif

Знову ж таки, тепер лише для спрощення опису елементів команди, розіб́’ємо на кілька рядків.

1
2
3
4
$ convert ms*png \
> -layers optimize \
> -delay 95x1000 \
> p2-p3-live.gif
  1. Викликаємо ту ж саму програму, але тепер без циклу. Замість зразка імені ms*png командний процесор підставить послідовно в алфавітному порядку імена всіх файлів, які розпізнаються зразком. Файли відкриються в послідовних шарах.
  2. Звести шари з оптимізацією. При цьому виділяється спільна частина всіх зображень і наступні шари робляться з прозорістю там, де вони співпаадють з основою. Оскільки на цих осцилограмах доволі велика частина зображення статична, вихідний файл буде мати в кілька разів менший розмір.
  3. Встановлюємо затримку між кадрами 95 тіків при 1000 тіків на секунду, тобто 95 мілісекунд.
  4. Ім’я файлу, в який програма має записати анімовану картинку.

І виходить ось таке:

Live oscillogram - animated GIF


p.s. Якщо використовувати ImageMagick для Windows, то перший командний рядок буде таким:

for %f in (s*.png) do convert -background white %f -extent 400x234-80 \
p2-p3-markers.png -layers merge m%f

А другий не поміняється.

2 коментарі to “Анімована осцилограма.”

  1. dor сказав:

    Класно, *дуже* класно!-)

    ps. “Для віндовз” мені чомусь доводилося казати “for %f in (s*.png) do …” — брати у дужки… Наче… Бо казало “непредвиденное появление…”.

    • ReAl сказав:

      Точно! Дякую, виправляю.

      Бач, як швидко забувається 😉
      Особливо коли “зкопіпастити” і підредагувати хочеться, а не написати з нуля так, як воно має бути.

Leave a Reply

[flagcounter image]