2012-06-05 3 views
5

Ecco lo scenario, voglio creare un insieme di jpg casuali, piccoli - ovunque tra 50 byte e 8k di dimensione - il reale contenuto visivo del jpeg è irrilevante fintanto che sono validi. Devo generare più o meno un migliaio e tutti devono essere unici, anche se sono diversi solo da un singolo pixel. Posso semplicemente scrivere un'intestazione/piè di pagina jpeg e alcuni byte casuali? Non sono in grado di utilizzare foto o serie di foto esistenti dal Web.Crea un set di JPG casuali

Il secondo problema è che l'insieme di immagini deve essere diverso per ogni esecuzione del programma.

Preferirei farlo in python, poiché gli script di wrapping sono in Python.

Ho cercato codice Python per generare jpg da zero e non ho trovato nulla, quindi i puntatori alle librerie sono altrettanto validi.

+1

provare il http://www.pythonware.com/products/pil/ – corn3lius

risposta

13

Se le immagini possono essere solo rumore casuale, è possibile generare un array utilizzando numpy.random e salvarle utilizzando il codice Image.save di PIL.

Questo esempio potrebbe essere ampliato, compresi i modi per evitare una ripetizione (molto improbabile) di modelli:

import numpy, Image 

for n in xrange(10): 
    a = numpy.random.rand(30,30,3) * 255 
    im_out = Image.fromarray(a.astype('uint8')).convert('RGBA') 
    im_out.save('out%000d.jpg' % n) 

Queste condizioni devono essere soddisfatte al fine di ottenere immagini JPEG:

  1. L'array ha bisogno di essere modellato (m, n, 3) - tre colori, RG e B;
  2. Ogni elemento (ogni colore di ogni pixel) deve essere un intero byte (uint o intero senza segno a 8 bit), che varia da 0 a 255.

Additionaly, qualche altro modo oltre pura casualità potrebbe essere utilizzato per generare le immagini nel caso in cui non si desideri il rumore puro.

+0

Questo va bene - non so se c'è qualche formato che bisogno valida di JPG a seguire - come la profondità del colore, CRC, ecc Speravo davvero che ci sarebbe stata una biblioteca. – Kylar

+0

Sì, la libreria in questo caso è PIL (Python Image Library). È possibile generare un array con o senza Numpy e quindi convertirlo in JPG tramite le funzioni di alto livello di PIL, come 'Image.fromarray(). Convert()' e 'Image.save()'. – heltonbiker

+0

È possibile eliminare la possibilità di duplicati eseguendo un hash sull'array e testando se l'hash è già parte di un set. Potresti ottenere un falso positivo ma ciò non danneggerebbe nulla. –

0

Se siete alla ricerca di un modo per fare questo senza NumPy questo ha funzionato per me

(Python 3.6 per byte, è ancora necessario Pillow)

import random as r 
from PIL import Image 

dat = bytes([r.randint(1,3) for x in range(4500000)]) 
i = Image.frombytes('1', (200,200), dat) 
0

Se non vi interessa circa il contenuto di un file, è possibile creare JPEG valido utilizzando Cuscino (PIL.Image.new [0]) in questo modo:

from PIL import Image 

width = height = 128 
valid_solid_color_jpeg = Image.new(mode='RGB', size=(width, height), color='red') 
valid_solid_color_jpeg.save('red_image.jpg') 

[0] https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.new

// EDIT: Ho pensato che OP vuole generare immagini valide e non si preoccupa del loro contenuto (è per questo che ho suggerito immagini a tinta unita). Ecco una funzione che genera immagini valide con pixel casuali e come bonus scrive una stringa casuale sull'immagine generata. L'unica dipendenza è Pillow, tutto il resto è puro Python.

import random 
import uuid 

from PIL import Image, ImageDraw  


def generate_random_image(width=128, height=128): 
    rand_pixels = [random.randint(0, 255) for _ in range(width * height * 3)] 
    rand_pixels_as_bytes = bytes(rand_pixels) 
    text_and_filename = str(uuid.uuid4()) 

    random_image = Image.frombytes('RGB', (width, height), rand_pixels_as_bytes) 

    draw_image = ImageDraw.Draw(random_image) 
    draw_image.text(xy=(0, 0), text=text_and_filename, fill=(255, 255, 255)) 
    random_image.save("{file_name}.jpg".format(file_name=text_and_filename)) 

# Generate 42 random images: 
for _ in range(42): 
    generate_random_image() 
+0

Che non funziona, creerà la stessa immagine ogni volta. – Kylar

+0

Vedere la mia risposta aggiornata, ho aggiunto la funzione che genera immagini con pixel casuali. – illagrenan