2014-01-29 56 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可能会有所帮助。