2014-01-29 54 views
1

我試圖將兩個顏色編碼的gif圖像合併成一個圖像,再加上其他幾種情況,我需要從頭開始生成一個gif圖像。我可以從一個gif圖像複製到一個新的'P'圖像,但顏色不會複製。我最終得到黑白和灰度圖像,而不是我開始使用的圖像的精確副本。我只是從頭開始嘗試,以確保在繼續前進之前我已經完成了流程。到目前爲止,我沒有這個過程。將顏色從一個gif圖像複製到一個新的gif圖像

from PIL import Image 

filename = '/media/image1.gif' 

im = Image.open(filename); 
size = width, height = im.size 

coordinates = x,y = width, height 
img = Image.new('P',coordinates) 
pixels = img.load() 

for x in range(img.size[0]): 
    for y in range(img.size[1]): 
     coordinates = x,y 
     pixels[x,y]=im.getpixel(coordinates) 

img.show() 

我做錯了什麼讓顏色轉移過來?

+0

GIF圖像是索引顏色。您是否在尋找複製調色板的方法? – 9000

+0

我想我可能會丟失的是索引顏色概念。我認爲顏色編號是0-255。就像我剛纔所說的,我正在考慮剝離單個像素的顏色,並將所添加的顏色值與所顯示的顏色相加,然後創建一個具有附加值的新圖形。我不認爲複製調色板會有什麼不同嗎? – confused

+0

顏色編號只是數字,而不是RGB值。這些數字和實際的RGB顏色之間有一個映射,稱爲[調色板](https://en.wikipedia.org/wiki/Gif#Palettes)。他們說像'img.palette.getvalues()'應該給你調色板數據,你可能會複製它,看看文檔。 – 9000

回答

1

我建議使用im.convert('RGB')手動重新創建im的調色板,因爲調色板的東西記錄不完整。

pal_inds = list(im.getdata()) # e.g. [1, 4, 5, ...] 
pal_rgbs = list(im.convert('RGB').getdata()) # e.g. [(255, 255, 0), ...] 
pal_map = dict((zip(pal_inds, pal_rgbs))) 

然後使用putpalette與價值觀的扁平列表從pal_map調色板創建一個新的形象:

img = Image.new("P", im.size, 0) 
palette = [pal_map[i] for i in sorted(pal_map)] 
flat_palette = [ind for rgb in palette for ind in rgb] 
img.putpalette(flat_palette) 

然後你應該能夠使用pixels因爲你之前嘗試。另外,this可能會有所幫助。