Générateur d'images aléatoires

14

Je génère des données aléatoires et j'essaie de les convertir en une image PNG en utilisant:

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:-

Cette commande affiche toujours une image grisâtre avec quelques pixels RVB. Qu'est-ce que je fais mal ?

Mon objectif final est de générer au moins une image avec des données aléatoires.

pxoto
la source
Définissez «aléatoire». La moyenne visuelle d'un tas de valeurs RVB aléatoires tendra vers le gris, après tout.
Wildcard
C'est ce que je pensais, mais je n'ai pas pu confirmer cette théorie car chaque image a presque la même apparence.
pxoto
Il y a 15 ans, j'ai fait quelque chose de similaire en Basic (Chipmunk Basic, pour être précis). J'avais une petite fenêtre graphique et continuais à produire un pixel de couleur aléatoire à un emplacement aléatoire. Le résultat était une image en constante évolution qui restait essentiellement la même tout le temps, comme la couleur statique sur un téléviseur à l'ancienne. Ce n'est pas vraiment gris, mais la couleur est statique .
Wildcard
J'ai réussi à générer de la statique mais les images sont pour la plupart encore grises.
pxoto

Réponses:

17

Tout d'abord, vous devez alimenter display RGB:-des octets bruts, pas une chaîne hexadécimale codée comme vous construisez avec ce hexdump | sed | trpipeline.

Deuxièmement, vous ne lui donnez pas assez d'octets: vous avez besoin de 3 octets par pixel, un pour chaque canal de couleur.

Cela fait ce que vous voulez:

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

Pour enregistrer directement au format PNG, vous pouvez procéder comme suit:

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

Voici une image de sortie typique:

Image RVB générée à partir de / dev / urandom


Si vous souhaitez créer une animation, il n'est pas nécessaire de créer et d'enregistrer des images individuelles. Vous pouvez alimenter un flux d'octets brut directement vers ffmpeg / avconv, par exemple

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
la source
Je ne peux pas croire que vous l'ayez réellement résolu, j'étudierai la commande pour comprendre comment cela fonctionne.
pxoto