2012-06-05 5 views
5

Вот сценарий, я хочу создать набор случайных маленьких jpg - размером от 50 до 8k - фактический визуальный контент jpeg не имеет значения до тех пор, пока они действительны. Мне нужно создать тысячу или около того, и все они должны быть уникальными - даже если они отличаются друг от друга только одним пикселем. Могу ли я просто написать jpeg header/footer и некоторые случайные байты? Я не могу использовать существующие фотографии или наборы фотографий из Интернета.Создайте набор случайных JPG

Вторая проблема заключается в том, что набор изображений должен отличаться для каждого запуска программы.

Я бы предпочел сделать это в python, так как сценарии обертки находятся в Python.

Я искал код python для создания jpg с нуля и ничего не нашел, поэтому указатели на библиотеки так же хороши.

+1

попробовать http://www.pythonware.com/products/pil/ – corn3lius

ответ

13

Если изображения могут быть только случайным шумом, вы можете сгенерировать массив с помощью numpy.random и сохранить их с помощью PIL Image.save.

Этот пример может быть расширен, в том числе способами, чтобы избежать (очень маловероятно) повторение моделей:

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) 

Эти условия должны быть выполнены для того, чтобы получить Jpeg изображения:

  1. Массив (m, n, 3) - три цвета, RG и B;
  2. Каждый элемент (каждый цвет каждого пикселя) должен быть байтовое целое (UINT или целое число без знака с 8 битами), в диапазоне от 0 до 255.

Additionaly, каким-либо другим способом, кроме чистой случайности может для генерации изображений в случае, если вы не хотите чистого шума.

+0

Это нормально - я не знаю, есть ли какой-то формат, который необходимо действительное Jpg, чтобы следовать - как глубина цвета, КРО и т.д. Я действительно надеялся, что там будет библиотека. – Kylar

+0

Да, библиотека в этом случае PIL (Библиотека изображений Python). Вы можете сгенерировать массив с или с помощью Numpy, а затем преобразовать его в JPG с помощью функций высокого уровня из PIL, например 'Image.fromarray(). Convert()' и 'Image.save()'. – heltonbiker

+0

Вы можете исключить возможность дублирования, выполнив хэш на массиве и проверив, чтобы хэш уже был частью набора. Вы можете получить ложный результат, но это ничего не повредит. –

0

Если вы ищете способ сделать это без NumPy это работало для меня

(питон 3.6 для байт, вы по-прежнему необходимы Подушка)

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

Если вы не заботитесь о содержании файла, вы можете создать действительный JPEG с использованием подушки (PIL.Image.new [0]) таким образом:

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: Я думал, что OP хочет генерировать правильные изображения и не заботится об их содержании (поэтому я предложил сплошные цветные изображения). Вот функция, которая генерирует достоверные изображения со случайными пикселями и в качестве бонуса записывает случайную строку в сгенерированное изображение. Единственная зависимость - Pillow, все остальное - чистый 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

Это не работает, он будет создавать одно и то же изображение каждый раз. – Kylar

+0

См. Мой обновленный ответ. Я добавил функцию, которая генерирует изображения со случайными пикселями. – illagrenan

Смежные вопросы