2012-06-05 16 views
5

Aquí está el escenario, quiero crear un conjunto de jpg pequeños y aleatorios, en cualquier lugar entre 50 bytes y 8k de tamaño, el contenido visual real del jpeg es irrelevante siempre que sean válidos. Necesito generar mil o más, y todos tienen que ser únicos, incluso si solo son diferentes por un solo píxel. ¿Puedo escribir un encabezado/pie de página jpeg y algunos bytes aleatorios allí? No puedo usar fotos existentes o conjuntos de fotos de la web.Crear conjunto de JPG aleatorios

La segunda cuestión es que el conjunto de imágenes tiene que ser diferente para cada ejecución del programa.

Preferiría hacer esto en python, ya que los scripts de envoltura están en Python.

He buscado código python para generar jpg desde cero, y no encontré nada, por lo que los punteros a las bibliotecas son igual de buenos.

+1

probar el http://www.pythonware.com/products/pil/ – corn3lius

Respuesta

13

Si las imágenes pueden ser solo de ruido aleatorio, entonces puede generar una matriz usando numpy.random y guardarlas usando el de PIL.

Este ejemplo podría ser ampliado, incluyendo formas de evitar una repetición (muy improbable) de los patrones:

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) 

Estas condiciones deben cumplirse con el fin de obtener imágenes JPEG:

  1. La matriz necesita ser modelado (m, n, 3) - tres colores, RG y B;
  2. Cada elemento (cada color de cada píxel) tiene que ser un número entero de bytes (uint, o entero sin signo de 8 bits), que van desde 0 a 255.

Adicionalmente, de alguna otra manera además de aleatoriedad pura podría ser utilizado para generar las imágenes en caso de que no desee un ruido puro.

+0

Eso está bien - no sé si hay algún formato que la necesidad de JPG válida a seguir - al igual que la profundidad del color, del CRC, etc. Realmente estaba esperando que hubiera una biblioteca. – Kylar

+0

Sí, la biblioteca en este caso es PIL (Biblioteca de imágenes de Python). Se puede generar una matriz con o withoug Numpy, y luego convertirlo a JPG a través de las funciones de alto nivel de PIL, como 'Image.fromarray(). Convertir()' y 'Image.save()'. – heltonbiker

+0

Puede eliminar la posibilidad de duplicar haciendo un hash en la matriz y probando para ver si el hash ya es parte de un conjunto. Puede obtener un falso positivo, pero eso no dañaría nada. –

0

Si usted está buscando una manera de hacer esto sin numpy esto funcionó para mí

(Python 3.6 para bytes, que todavía necesitan almohada)

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

Si no se preocupan por el contenido de un archivo, puede crear JPEG válido que usa la almohadilla (PIL.Image.new [0]) de esta manera:

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

// EDITAR: Pensé que OP quiere generar imágenes válidas y no le importa su contenido (es por eso que sugerí imágenes de color sólido). Aquí hay una función que genera imágenes válidas con píxeles aleatorios y como bonificación escribe cadena aleatoria para la imagen generada. La única dependencia es Pillow, todo lo demás es 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

Eso no funciona, creará la misma imagen cada vez. – Kylar

+0

Ver mi respuesta actualizada, he agregado una función que genera imágenes con píxeles aleatorios. – illagrenan

Cuestiones relacionadas