2010-06-25 8 views
7

Sử dụng Python Thư viện hình ảnh, tôi có thể gọiPIL: Chuyển đổi hình ảnh RGB thành bảng màu 8 bit cụ thể?

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

hoặc

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

nhưng là có một cách để chuyển đổi sang một bảng màu tùy ý?

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

nơi nó sẽ ánh xạ từng pixel đến màu gần nhất được tìm thấy trong hình ảnh? Hoặc điều này có được hỗ trợ cho Image.WEB và không có gì khác không?

Trả lời

4

Trong khi tìm kiếm thông qua các mã nguồn của convert() tôi thấy rằng nó tham chiếu im.quantize. quantize có thể lấy đối số bảng. Nếu bạn cung cấp một hình ảnh có bảng màu, chức năng này sẽ lấy bảng màu đó và áp dụng nó cho hình ảnh.

Ví dụ:

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

Câu trả lời cung cấp khác không làm việc cho tôi (nó đã làm một số thực sự tồi tệ chuyển đổi bảng đôi hoặc một cái gì đó,) nhưng giải pháp này đã làm.

2

Ví dụ đầu tiên ImagePalettemodule docs's cho thấy cách đính kèm bảng màu vào hình ảnh, nhưng hình ảnh đó phải có chế độ "P" hoặc "L". Người ta có thể, tuy nhiên, điều chỉnh ví dụ để chuyển đổi một hình ảnh RGB đầy đủ để một bảng màu của sự lựa chọn của bạn:

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

Bạn đã thử nghiệm điều này chưa? –

+0

Tôi khá chắc chắn vào thời điểm đó (~ 5 năm trước). Nó có hiệu quả với bạn không? –

+1

Tôi không thử. Tôi vết thương bằng cách sử dụng im.quantize() –