2012-06-05 16 views
5

Oto scenariusz, chcę utworzyć zestaw losowych, małych jpg - o wielkości od 50 bajtów do 8k - rzeczywista zawartość wizualna jpeg jest nieistotna, o ile są one poprawne. Muszę wygenerować około tysiąca, a wszystkie muszą być unikalne - nawet jeśli różnią się tylko o jeden piksel. Czy mogę po prostu napisać nagłówek/stopkę jpeg i kilka losowych bajtów? Nie mogę korzystać z istniejących zdjęć ani zestawów zdjęć z internetu.Utwórz zestaw losowych plików JPG

Drugą kwestią jest to, że zestaw obrazów musi być inny dla każdego uruchomienia programu.

Wolę to zrobić w python, ponieważ skrypty owijające są w Pythonie.

Szukałem kodu Pythona do generowania plików jpg od zera, i nie znalazłem niczego, więc wskaźniki do bibliotek są równie dobre.

+1

spróbować http://www.pythonware.com/products/pil/ – corn3lius

Odpowiedz

13

Jeśli obrazy mogą być tylko losowym szumem, można wygenerować tablicę przy użyciu numpy.random i zapisać je przy użyciu adresu PIL Image.save.

Przykład ten może być rozszerzony, w tym sposoby, aby uniknąć (bardzo mało prawdopodobne) powtarzanie wzorów:

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) 

Te warunki muszą być spełnione, aby uzyskać obrazy jpeg:

  1. Tablica musi być ukształtowany (m, n, 3) - trzy kolory, RG i B;
  2. Każdy element (każdego koloru każdego z pikseli) musi być liczbą całkowitą bajtów (unit, lub liczbę całkowitą bez znaku z 8 bitów), w zakresie od 0 do 255.

Dodatkowo, niektóre inne sposób Obok czystej może przypadkowości być używane w celu generowania obrazów na wypadek, gdybyś nie chciał czystego szumu.

+0

To dobrze - nie wiem, czy istnieje jakiś format, który potrzeba ważnego jpg, aby śledzić - jak głębia koloru, CRC itp Naprawdę miałem nadzieję, że będzie biblioteka. – Kylar

+0

Tak, biblioteka w tym przypadku to PIL (Python Image Library). Możesz wygenerować tablicę z Numpy lub withoug, a następnie przekonwertować ją do JPG za pomocą funkcji wysokiego poziomu z PIL, takich jak 'Image.fromarray(). Convert()' i 'Image.save()'. – heltonbiker

+0

Możesz wyeliminować możliwość duplikatów, wykonując hasz w tablicy i testując, aby sprawdzić, czy hash jest już częścią zestawu. Możesz uzyskać fałszywy wynik pozytywny, ale to niczego nie zaszkodzi. –

0

Jeśli szukasz sposobu, aby to zrobić bez numpy ten pracował dla mnie

(Python 3.6 dla bajtów, trzeba jeszcze 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

Jeśli nie dbają o treści pliku, można utworzyć poprawny JPEG za pomocą poduszek (PIL.Image.new [0]) w ten sposób:

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

// EDYCJA: Myślałem, że OP chce generować prawidłowe obrazy i nie dba o ich zawartość (dlatego zaproponowałem jednolite obrazy). Oto funkcja, która generuje prawidłowe obrazy z losowymi pikselami i jako bonus zapisuje losowy ciąg do wygenerowanego obrazu. Jedyną zależnością jest Pillow, wszystko inne to czysty 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

To nie działa, za każdym razem stworzy ten sam obraz. – Kylar

+0

Zobacz moją zaktualizowaną odpowiedź, dodałem funkcję, która generuje obrazy z losowymi pikselami. – illagrenan