为了账号安全,请及时绑定邮箱和手机立即绑定

使用PIL获取像素的RGB

使用PIL获取像素的RGB

芜湖不芜 2019-12-21 12:53:32
是否可以使用PIL获得像素的RGB颜色?我正在使用此代码:im = Image.open("image.gif")pix = im.load()print(pix[1,1])但是,它仅输出一个数字(例如0或1),而不输出三个数字(例如,60,60,60对于R,G,B)。我想我对功能不了解。我想解释一下。非常感谢。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

是的,这样:


im = Image.open('image.gif')

rgb_im = im.convert('RGB')

r, g, b = rgb_im.getpixel((1, 1))


print(r, g, b)

(65, 100, 137)

之所以之前获得单个值,pix[1, 1]是因为GIF像素引用了GIF调色板中的256个值之一。


另请参见此 SO帖子:GIF和JPEG的Python和PIL像素值不同,并且此PIL参考页面 包含有关该convert()函数的更多信息。


顺便说一句,您的代码将对.jpg图像正常工作。


查看完整回答
反对 回复 2019-12-21
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

GIF将颜色存储为调色板中x种可能颜色中的一种。阅读有关gif受限调色板的信息。因此,PIL为您提供调色板索引,而不是该调色板颜色的颜色信息。


编辑:删除了具有错字的博客帖子解决方案的链接。其他答案也做同样的事情而没有错字。


查看完整回答
反对 回复 2019-12-21
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

转换图像的另一种方法是从调色板创建RGB索引。


from PIL import Image


def chunk(seq, size, groupByList=True):

    """Returns list of lists/tuples broken up by size input"""

    func = tuple

    if groupByList:

        func = list

    return [func(seq[i:i + size]) for i in range(0, len(seq), size)]



def getPaletteInRgb(img):

    """

    Returns list of RGB tuples found in the image palette

    :type img: Image.Image

    :rtype: list[tuple]

    """

    assert img.mode == 'P', "image should be palette mode"

    pal = img.getpalette()

    colors = chunk(pal, 3, False)

    return colors


# Usage

im = Image.open("image.gif")

pal = getPalletteInRgb(im)


查看完整回答
反对 回复 2019-12-21
  • 3 回答
  • 0 关注
  • 1263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信