Во-первых, вам нужно передать display RGB:-
необработанные байты, а не закодированную шестнадцатеричную строку, как вы строите с этим hexdump | sed | tr
конвейером.
Во-вторых, вы не даете ему достаточно байтов: вам нужно 3 байта на пиксель, по одному для каждого цветового канала.
Это делает то, что вы хотите:
mx=320;my=256;head -c "$((3*mx*my))" /dev/urandom | display -depth 8 -size "${mx}x${my}" RGB:-
Чтобы сохранить непосредственно в PNG, вы можете сделать это:
mx=320;my=256;head -c "$((3*mx*my))" /dev/urandom | convert -depth 8 -size "${mx}x${my}" RGB:- random.png
Вот типичное выходное изображение:
Если вы хотите сделать анимацию, нет необходимости создавать и сохранять отдельные кадры. Вы можете передать поток необработанных байтов прямо в ffmpeg / avconv, например
mx=320; my=256; nframes=100; dd if=/dev/urandom bs="$((mx*my*3))" count="$nframes" | avconv -r 25 -s "${mx}x${my}" -f rawvideo -pix_fmt rgb24 -i - random.mp4