9

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

第二个问题是程序每次运行的图像集都必须不同。

我更喜欢在 python 中执行此操作,因为包装脚本在 Python 中。

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

4

3 回答 3

16

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

这个例子可能会被扩展,包括避免(非常不可能)重复模式的方法:

import numpy
from PIL import Image

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

必须满足这些条件才能获得 jpeg 图像:

  1. 阵列需要整形(m,n,3)——三种颜色,RG和B;
  2. 每个元素(每个像素的每种颜色)必须是字节整数(uint,或 8 位的无符号整数),范围从 0 到 255。

此外,除了纯随机性之外,还可以使用其他方式来生成图像,以防您不想要纯噪声。

于 2012-06-05T16:26:04.920 回答
4

如果您不关心文件的内容,您可以通过PIL.Image.new以下方式使用 Pillow ( [0]) 创建有效的 JPEG:

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()
于 2017-12-12T12:41:21.597 回答
0

如果您正在寻找一种没有 numpy 的方法来做到这一点,这对我有用

(python 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)
于 2017-11-06T17:51:02.207 回答