【问题标题】:Copying color from one gif image to a new gif image将颜色从一个 gif 图像复制到新的 gif 图像
【发布时间】:2014-01-29 21:34:11
【问题描述】:

我正在尝试拍摄两张彩色编码的 gif 图像并将它们组合成一张图像,以及我需要从头开始生成彩色 gif 图像的其他几种情况。我可以从一个 gif 图像复制到一个新的“P”图像,但颜色不会复制。我最终得到一张黑白/灰度图像,而不是我开始时图像的精确副本。我只是从头开始尝试,以确保在继续前进之前我已经完成了进程。到目前为止,我还没有完成这个过程。

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()

我做错了什么来转移颜色?

【问题讨论】:

  • GIF 图像是索引颜色。您是否在寻找复制调色板的方法?
  • 我认为我可能会迷失的地方是索引颜色概念。我以为颜色编号是 0-255。就像我最初所说的那样,我正在考虑去除单个像素的颜色,而不是将与显示的颜色相关的值相加,并用增加的值制作一个新图表。我认为复制调色板不会有什么不同吗?
  • 颜色数字只是数字,不是 RGB 值。在这些数字和实际 RGB 颜色之间有一个映射,称为palette。他们说像img.palette.getvalues() 这样的东西应该给你调色板数据,你可能会以某种方式复制它,看看文档。
  • 我一直在阅读过去的问题,这就是我的感觉。我绝对没有意识到颜色(RGB 值)不是固定值,而是由用户/程序员设置的。我学得很快。
  • 我也知道获取调色板并不是什么大问题,但我没有看到任何显示你如何设置调色板的东西。您是否只是创建一个元组并将调色板放入一个元组中,然后引用该元组来选择颜色。我知道我刚才说的是什么,但如果我是对的,那又是另一回事了。今晚回家后,我将不得不考虑这个想法。我可能有点过头了。

标签: python python-imaging-library


【解决方案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 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 2015-05-28
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2011-05-12
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多