RGB Int到RGB - Python

时间:2010-02-14 17:54:30

标签: python integer rgb

如何将RGB整数转换为相应的RGB元组(R,G,B)?看起来很简单,但我在谷歌上找不到任何东西。

我知道对于每个RGB (r,g,b)你有整数n = r256^2 + g256 + b,我如何在Python中解决反向,给定n的IE,我需要rgb值。

10 个答案:

答案 0 :(得分:43)

我不是一个Python专家,但据我所知,它有与C相同的运算符。

如果是这样,这应该有效,它也应该比使用modulo和division快得多。

Blue =  RGBint & 255
Green = (RGBint >> 8) & 255
Red =   (RGBint >> 16) & 255

在每种情况下屏蔽掉最低字节是什么(二进制和255 ...等于8位)。对于绿色和红色分量,它会做同样的事情,但首先将颜色通道转换为最低字节。

答案 1 :(得分:14)

从RGB整数:

Blue =  RGBint mod 256
Green = RGBint / 256 mod 256
Red =   RGBint / 256 / 256 mod 256

一旦你知道如何获得它,这可以非常简单地实现。 :)

Upd:添加了python函数。不确定是否有更好的方法,但这适用于Python 3和2.4

def rgb_int2tuple(rgbint):
    return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256)

还有一个优秀的解决方案,使用比特移位和屏蔽,这无疑比Nils Pipenbrinck发布的更快。

答案 2 :(得分:9)

>>> import struct
>>> str='aabbcc'
>>> struct.unpack('BBB',str.decode('hex'))
(170, 187, 204)

for python3:
>>> struct.unpack('BBB', bytes.fromhex(str))

>>> rgb = (50,100,150)
>>> struct.pack('BBB',*rgb).encode('hex')
'326496'

for python3:
>>> bytes.hex(struct.pack('BBB',*rgb))

答案 3 :(得分:6)

我假设您有一个包含RGB值的32位整数(例如ARGB)。然后,您可以使用struct模块解压缩二进制数据:

# Create an example value (this represents your 32-bit input integer in this example).
# The following line results in exampleRgbValue = binary 0x00FF77F0 (big endian)
exampleRgbValue = struct.pack(">I", 0x00FF77F0)

# Unpack the value (result is: a = 0, r = 255, g = 119, b = 240)
a, r, g, b = struct.unpack("BBBB", exampleRgbValue)

答案 4 :(得分:6)

>>> r, g, b = (111, 121, 131)
>>> packed = int('%02x%02x%02x' % (r, g, b), 16)

这会产生以下整数:

>>> packed
7305603

然后你可以用很明确的方式解压缩它:

>>> packed % 256
255
>>> (packed / 256) % 256
131
>>> (packed / 256 / 256) % 256
121
>>> (packed / 256 / 256 / 256) % 256
111

..或以更紧凑的方式:

>>> b, g, r = [(packed >> (8*i)) & 255 for i in range(3)]
>>> r, g, b

示例适用于任意数量的数字,例如RGBA颜色:

>>> packed = int('%02x%02x%02x%02x' % (111, 121, 131, 141), 16)
>>> [(packed >> (8*i)) & 255 for i in range(4)]
[141, 131, 121, 111]

答案 5 :(得分:3)

对于使用Google的Appengine Images Python API的任何人来说都是一个注释。我发现我遇到了一种需要提供32位RGB颜色值的方法的情况。

具体来说,如果您使用API​​转换PNG(或任何具有透明像素的图像),则需要为execute_transforms方法提供名为transparent_substitution_rgb的参数,该参数必须是32位RGB颜色值

借用dbr的答案,我想出了一个类似的方法:

def RGBTo32bitInt(r, g, b):
  return int('%02x%02x%02x' % (r, g, b), 16)

transformed_image = image.execute_transforms(output_encoding=images.JPEG, transparent_substitution_rgb=RGBTo32bitInt(255, 127, 0))

答案 6 :(得分:2)

def unpack2rgb(intcol):
    tmp, blue= divmod(intcol, 256)
    tmp, green= divmod(tmp, 256)
    alpha, red= divmod(tmp, 256)
    return alpha, red, green, blue

如果只接受divmod(value, (divider1, divider2, divider3…))建议,那么它也会简化各种时间转换。

答案 7 :(得分:0)

这可能是一种更短的方式:

dec=10490586
hex="%06x" % dec
r=hex[:2]
g=hex[2:4]
b=hex[4:6]
rgb=(r,g,b)

编辑:这是错误的 - 给出Hex的答案,OP想要int。 EDIT2:精炼以减少痛苦和失败 - 需要'%06x'以确保十六进制总是显示为六位数[感谢Peter Hansen的评论]。

答案 8 :(得分:-1)

If you are using NumPy and you have an array of RGBints, you can also just change its dtype to extract the red, green, blue and alpha components:

>>> type(rgbints)
numpy.ndarray
>>> rgbints.shape
(1024L, 768L)
>>> rgbints.dtype
dtype('int32')
>>> rgbints.dtype = dtype('4uint8')
>>> rgbints.shape
(1024L, 768L, 4L)
>>> rgbints.dtype
dtype('uint8')

答案 9 :(得分:-1)

添加到上面提到的内容。简洁的单行代理。

# 2003199 or #E190FF is Dodger Blue.
tuple((2003199 >> Val) & 255 for Val in (16, 8, 0))
# (30, 144, 255)

以避免将来出现任何混淆。

from collections import namedtuple
RGB = namedtuple('RGB', ('Red', 'Green', 'Blue'))
rgb_integer = 16766720  # Or #ffd700 is Gold.
# The unpacking asterisk prevents a TypeError caused by missing arguments.
RGB(*((rgb_integer >> Val) & 255 for Val in (16, 8, 0)))
# RGB(Red=255, Green=215, Blue=0)