2012-06-05 104 views
5

这里是场景,我想创建一组随机的小jpg - 任何位于50字节和8k大小之间的区域 - 只要jpeg有效,实际的jpeg视觉内容就无关紧要。我需要生成一千个左右,并且它们都必须是唯一的 - 即使它们只有一个像素不同。我可以在那里写一个jpeg头/页脚和一些随机字节吗?我无法使用网络上的现有照片或照片集。创建一组随机JPGs

第二个问题是,对于程序的每次运行,该组图像必须不同。

我宁愿在python中这样做,因为包装脚本在Python中。

我已经寻找python代码来从头开始生成jpg的,并没有找到任何东西,所以指向库的指针也一样好。

+1

尝试http://www.pythonware.com/products/pil/ – corn3lius

回答

13

如果图像只能是随机噪声,那么您可以使用numpy.random生成一个数组,并使用PIL的Image.save保存它们。

这个例子可能会扩大,包括如何避免图案(不太可能)重复:

  1. 数组:

    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图像得到满足需要成形(m,n,3) - 三种颜色,RG和B;

  2. 每个元件(每个像素的每个颜色)必须是一个字节的整数(uint或具有8个比特无符号整数),范围从0到255

Additionaly,除了纯随机性一些其它方式可能用于在您不想要纯噪音的情况下生成图像。

+0

这很好 - 我不知道是否有这么有效的JPG文件需要遵循某种格式 - 般的色彩深度,铁通等我真的希望会有一个图书馆。 – Kylar

+0

是的,这种情况下的库是PIL(Python图像库)。你可以用numpy生成一个数组,然后通过PIL的高级函数将它转换为JPG,如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

//编辑:我以为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