2010-06-25 4 views
7
파이썬 이미징 라이브러리 사용

, 나는PIL : RGB 이미지를 특정 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

나는 im.quantize를 참조하는 것을 보았다. quantize은 팔레트 인수를 취할 수 있습니다. 팔레트가있는 이미지를 제공하면이 함수는 해당 팔레트를 가져 와서 이미지에 적용합니다.

예 :

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

다른 제공 대답은 나를 위해 작동하지 않았다 (이것은 정말 나쁜 더블 팔레트 변환 또는 뭔가했다)하지만이 솔루션 않았다.

2

ImagePalette 첫 번째 예는 팔레트를 이미지에 첨부하는 방법을 보여 주지만 이미 이미지는 "P" 또는 "L"이어야합니다. 하나는, 그러나, 당신의 선택의 팔레트에 전체 RGB 이미지를 변환하는 예를 적용 할 수 있습니다 convert()의 소스 코드를 보면서

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()를 사용하여 감았습니다. –

관련 문제