2012-01-04 11 views
8

मुझे शुद्ध पायथन के साथ एक काला और सफेद बीएमपी फ़ाइल बनाने की आवश्यकता है।मैं शुद्ध पायथन के साथ एक बीएमपी फ़ाइल कैसे बना सकता हूं?

मैंने विकिपीडिया, BMP file format पर एक लेख पढ़ा, लेकिन मैं निम्न स्तर के प्रोग्रामिंग पर अच्छा नहीं हूं और इस अंतर को अपने ज्ञान में भरना चाहता हूं।

तो सवाल यह है कि, मैं एक काले और सफेद बीएमपी फ़ाइल कैसे बना सकता हूं जिसमें पिक्सल का मैट्रिक्स है? मुझे शुद्ध पायथन के साथ ऐसा करने की ज़रूरत है, पीआईएल जैसे किसी मॉड्यूल का उपयोग न करें। यह सिर्फ मेरी शिक्षा के लिए है।

+1

['struct'] (http://docs.python.org/library/struct.html) मॉड्यूल देखें। –

+1

इसके अलावा, [यह मंच थ्रेड] जांचें (http://pseentertainmentcorp.com/smf/index.php?topic=2034.0)। – Chewie

+0

धन्यवाद, चेवी, यह वही है जो मुझे चाहिए –

उत्तर

3

आपको बीएमपी फ़ाइल की बाइनरी हेडर बनाने के लिए पाइथन के struct मॉड्यूल का उपयोग करना होगा। छवि डेटा को bytearray ऑब्जेक्ट में रखें - बाइटियर एक छोटा ज्ञात मूल पायथन डेटा प्रकार है जो सी स्ट्रिंग्स की तरह व्यवहार कर सकता है: म्यूटेबल बाइट्स जो प्रत्येक स्थिति में 0-255 से हस्ताक्षरित संख्या स्वीकार करते हैं, फिर भी मुद्रित और स्ट्रिंग के रूप में उपयोग किया जा सकता है (उदाहरण के लिए, file.write के लिए एक तर्क के रूप में)।

यहां एक छोटा प्रोग्राम है जो एक छवि बनाने के लिए संरचना और अन्य औजारों का उपयोग करता है और इसे शुद्ध पायथन में टीजीए फ़ाइल के रूप में लिखता है, जैसा कि आप करना चाहते हैं: http://www.python.org.br/wiki/ImagemTGA (यह उपनिवेशों का उपयोग नहीं करता है, लेकिन पायथन बजाय सरणी मॉड्यूल (जो भी दिलचस्प है)

8

construct पार्सिंग के लिए एक शुद्ध-अजगर पुस्तकालय और बाइनरी संरचनाओं, प्रोटोकॉल और फ़ाइल स्वरूपों के निर्माण है। यह बीएमपी प्रारूप समर्थन आउट-ऑफ-द-बॉक्स है।

यह struct के साथ हाथ-क्राफ्टिंग के मुकाबले बेहतर दृष्टिकोण हो सकता है। इसके अलावा, आपको वास्तव में उपयोगी लाइब्रेरी सीखने का मौका मिलेगा (construct सीर tainly है)

7

यह मोनोक्रोम बिटमैप्स के लिए एक पूर्ण जवाब है।

import math, struct 

mult4 = lambda n: int(math.ceil(n/4))*4 
mult8 = lambda n: int(math.ceil(n/8))*8 
lh = lambda n: struct.pack("<h", n) 
li = lambda n: struct.pack("<i", n) 

def bmp(rows, w): 
    h, wB = len(rows), int(mult8(w)/8) 
    s, pad = li(mult4(wB)*h+0x20), [0]*(mult4(wB)-wB) 
    s = li(mult4(w)*h+0x20) 
    return (b"BM" + s + b"\x00\x00\x00\x00\x20\x00\x00\x00\x0C\x00\x00\x00" + 
      lh(w) + lh(h) + b"\x01\x00\x01\x00\xff\xff\xff\x00\x00\x00" + 
      b"".join([bytes(row+pad) for row in reversed(rows)])) 

उदाहरण के लिए:

bmp(smile, 8) 

नोट यह है कि:

smile = [[0xFF], [0x81], [0xA5], [0x81], [0xA5], [0xBD], [0x81], [0xFF]] 

के साथ प्रस्तुत:

FF XXXXXXXX 
81 X......X 
A5 X.X..X.X 
81 X......X 
A5 X.X..X.X 
BD X.XXXX.X 
81 X......X 
FF XXXXXXXX 

तो, पंक्तियों की एक श्रृंखला के रूप में इस एन्कोडिंग प्रोग्रामर की ज़िम्मेदारी यह सुनिश्चित करने के लिए कि आवश्यक एनयू बाइट्स के मेबर आपूर्ति की गई प्रत्येक पंक्ति में मौजूद हैं।

काला रंग \ xff \ xff \ xff में निर्दिष्ट है और सफेद रंग निम्नलिखित \ x00 \ x00 \ x00 में निर्दिष्ट है, क्या आप उन्हें बदलना चाहते हैं।

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