2010-06-25 17 views
7

पायथन इमेजिंग पुस्तकालय का उपयोग करना, मैंपीआईएल: आरजीबी छवि को एक विशिष्ट 8-बिट पैलेट में कनवर्ट करें?

img.convert("P", palette=Image.ADAPTIVE) 

या

img.convert("P", palette=Image.WEB) 

कॉल कर सकते हैं, लेकिन वहाँ एक रास्ता एक मनमाना पैलेट में बदलने के लिए है?

p = [] 
for i in range(0, 256): 
    p.append(i, 0, 0) 
img.convert("P", palette=p) 

जहां यह प्रत्येक पिक्सेल को छवि में पाए गए निकटतम रंग में मैप करेगा? या यह Image.WEB के लिए समर्थित है और कुछ भी नहीं?

उत्तर

4

जबकि convert() के स्रोत कोड के माध्यम से देख मैंने देखा कि यह संदर्भ im.quantizequantize पैलेट तर्क ले सकता है। यदि आप एक ऐसी छवि प्रदान करते हैं जिसमें पैलेट है, तो यह फ़ंक्शन उस पैलेट को ले जाएगा और इसे छवि पर लागू करेगा।

उदाहरण:

src = Image.open("sourcefilewithpalette.bmp") 
    new = Image.open("unconvertednew24bit.bmp") 
    converted = new.quantize(palette=src) 
    converted.save("converted.bmp") 

अन्य प्रदान की जवाब मेरे लिए काम नहीं किया है (यह वास्तव में कुछ बुरा डबल पैलेट रूपांतरण या कुछ और, किया था), लेकिन इस समाधान किया।

2

ImagePalettemodule docs's पहले उदाहरण दिखाता है एक छवि के लिए एक पैलेट संलग्न करने के लिए कैसे, लेकिन उस छवि पहले से ही मोड "P" या "L" का होना चाहिए। एक, तथापि, उदाहरण के लिए अनुकूल अपनी पसंद का एक पैलेट के लिए एक पूर्ण आरजीबी छवि परिवर्तित करने के लिए कर सकते हैं:

from __future__ import division 
import Image 

palette = [] 
levels = 8 
stepsize = 256 // levels 
for i in range(256): 
    v = i // stepsize * stepsize 
    palette.extend((v, v, v)) 

assert len(palette) == 768 

original_path = 'original.jpg' 
original = Image.open(original_path) 
converted = Image.new('P', original.size) 
converted.putpalette(palette) 
converted.paste(original, (0, 0)) 
converted.show() 
+0

क्या आपने इसका परीक्षण किया है? –

+0

मुझे यकीन है कि मैंने उस समय किया था (~ 5 साल पहले)। क्या यह आपके लिए काम नहीं करता है? –

+1

मैंने कोशिश नहीं की। मैं im.quantize() का उपयोग कर घायल –

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