如何将RGB整数转换为相应的RGB元组(R,G,B)
?看起来很简单,但我在谷歌上找不到任何东西。
我知道对于每个RGB (r,g,b)
你有整数n = r256^2 + g256 + b
,我如何在Python中解决反向,给定n
的IE,我需要r
,g
,b
值。
答案 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)