Gerador de imagem aleatória

14

Estou gerando dados aleatórios e tentando convertê-los em uma imagem PNG usando:

head -c 1MB < /dev/urandom | hexdump -e '16/1 "_x%02X"' | sed 's/_/\\/g; s/\\x  //g; s/.*/    "&"/' | tr -d "\"" | display -depth 8 -size 1000x1000+0 rgb:-

Este comando sempre mostra uma imagem acinzentada com alguns pixels RGB. O que estou fazendo de errado ?

Meu objetivo final é gerar pelo menos uma imagem com dados aleatórios.

pxoto
fonte
Defina "aleatório". A média visual de vários valores aleatórios de RGB tenderá a cinza, afinal.
Curinga
Foi o que pensei, mas não pude confirmar essa teoria, já que toda imagem parece quase a mesma.
pxoto 14/06
Há 15 anos, fiz algo semelhante no Basic (Chipmunk Basic, para ser específico). Eu tinha uma pequena janela gráfica e continuava produzindo um pixel de cores aleatórias para um local aleatório. O resultado foi uma imagem em constante mudança que ainda parecia essencialmente a mesma o tempo todo - como estática de cores em uma TV antiquada. Não é realmente cinza, mas estático de cores .
Curinga
Eu consegui gerar um pouco de estática, mas as imagens ainda estão na maioria cinza.
pxoto 14/06

Respostas:

17

Primeiro, você precisa alimentar display RGB:-bytes brutos, não uma sequência hexadecimal codificada como a que você está construindo com esse hexdump | sed | trpipeline.

Em segundo lugar, você não está dando bytes suficientes: você precisa de 3 bytes por pixel, um para cada canal de cores.

Isso faz o que você deseja:

mx=320;my=256;head -c "$((3*mx*my))" /dev/urandom | display -depth 8 -size "${mx}x${my}" RGB:-

Para salvar diretamente no PNG, você pode fazer o seguinte:

mx=320;my=256;head -c "$((3*mx*my))" /dev/urandom | convert -depth 8 -size "${mx}x${my}" RGB:- random.png

Aqui está uma imagem de saída típica:

Imagem RGB gerada a partir de / dev / urandom


Se você deseja fazer uma animação, não há necessidade de criar e salvar quadros individuais. Você pode alimentar um fluxo de bytes brutos direto para ffmpeg / avconv, por exemplo

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
PM 2Ring
fonte
Não acredito que você realmente resolveu, estudarei o comando para descobrir como funciona.
pxoto