2012-06-05 16 views
5

का सेट बनाएं यहां परिदृश्य है, मैं यादृच्छिक, छोटे जेपीजी का एक सेट बनाना चाहता हूं - कहीं भी 50 बाइट्स और 8k आकार के बीच - जेपीईजी की वास्तविक दृश्य सामग्री तब तक अप्रासंगिक है जब तक कि वे मान्य हों। मुझे एक हजार या उससे अधिक उत्पन्न करने की ज़रूरत है, और उन्हें सभी अद्वितीय होना चाहिए - भले ही वे केवल एक पिक्सेल से अलग हों। क्या मैं बस एक जेपीईजी हेडर/पाद लेख और कुछ यादृच्छिक बाइट्स लिख सकता हूं? मैं वेब से मौजूदा तस्वीरों या तस्वीरों के सेट का उपयोग करने में सक्षम नहीं हूं।यादृच्छिक जेपीजी

दूसरा मुद्दा यह है कि कार्यक्रम के प्रत्येक भाग के लिए छवियों का सेट अलग होना चाहिए।

मैं इसे पायथन में करना पसंद करूंगा, क्योंकि रैपिंग स्क्रिप्ट पाइथन में हैं।

मैंने जेपीजी को स्क्रैच से उत्पन्न करने के लिए पाइथन कोड की तलाश की है, और कुछ भी नहीं मिला, इसलिए लाइब्रेरी के पॉइंटर्स उतने ही अच्छे हैं।

+1

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

उत्तर

13

यदि छवियां केवल यादृच्छिक शोर हो सकती हैं, तो आप numpy.random का उपयोग करके एक सरणी उत्पन्न कर सकते हैं और उन्हें पीआईएल के 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 चित्र प्राप्त करने में पूरी होनी चाहिए:

    यह उदाहरण तरीके पैटर्न की एक (बहुत संभावना नहीं) पुनरावृत्ति से बचने की भी शामिल है, का विस्तार किया जा सकता है आकार देने की जरूरत है (एम, एन, 3) - तीन रंग, आरजी और बी;

  2. प्रत्येक तत्व (प्रत्येक पिक्सेल के प्रत्येक रंग) एक बाइट पूर्णांक (uint, या 8 बिट के साथ अहस्ताक्षरित पूर्णांक), 0 से 255.

Additionaly, शुद्ध अनियमितता के अलावा किसी अन्य तरीके को लेकर हो गया है हो सकता है यदि आप शुद्ध शोर नहीं चाहते हैं तो छवियों को उत्पन्न करने के लिए इस्तेमाल किया जाए।

+0

कोशिश यह ठीक है - रंग गहराई, सीआरसी के, आदि जैसे - मैं कुछ प्रारूप कि पालन करने के लिए मान्य JPG की ज़रूरत नहीं है, तो पता नहीं है मैं वास्तव में उम्मीद कर रहा था कि एक पुस्तकालय होगा। – Kylar

+0

हां, इस मामले में पुस्तकालय पीआईएल (पायथन छवि पुस्तकालय) है। आप Numpy के साथ या सरणी के साथ एक सरणी उत्पन्न कर सकते हैं, और उसके बाद पीआईएल से उच्च स्तर के कार्यों के माध्यम से इसे जेपीजी में परिवर्तित कर सकते हैं, जैसे 'Image.fromarray()। कन्वर्ट() 'और' Image.save() '। – heltonbiker

+0

आप सरणी पर हैश करके डुप्लिकेट की संभावना को खत्म कर सकते हैं और यह देखने के लिए परीक्षण कर सकते हैं कि हैश पहले से ही सेट का हिस्सा है या नहीं। आपको झूठी सकारात्मक मिल सकती है लेकिन इससे कुछ भी नुकसान नहीं पहुंचाएगा। –

0

आप

(अजगर 3.6 बाइट्स के लिए, आप अभी भी तकिया की जरूरत है) numpy यह मेरे लिए काम किया बिना यह करने के लिए एक तरह से

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

आप सामग्री के बारे में परवाह नहीं है, तो के लिए देख रहे हैं एक फाइल की है, तो आप मान्य जेपीईजी तकिया का उपयोग कर बना सकते हैं (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

// संपादित करें: मैंने सोचा कि ओपी मान्य छवियां उत्पन्न करना चाहता है और उनकी सामग्री की परवाह नहीं करता है (यही कारण है कि मैंने ठोस रंग छवियों का सुझाव दिया)। यहां एक ऐसा फ़ंक्शन है जो यादृच्छिक पिक्सेल के साथ वैध छवियां उत्पन्न करता है और बोनस जेनरेट की गई छवि को यादृच्छिक स्ट्रिंग लिखता है। एकमात्र निर्भरता तकिया है, बाकी सब कुछ शुद्ध पायथन है।

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

संबंधित मुद्दे