将灰度值转换为RGB表示?

26

如何将灰度值(0-255)转换为RGB值/表示? 这是为了在SVG图像中使用,它似乎不支持灰度,只支持RGB ...

注意:这不是RGB->灰度,这已经在另一个问题中回答了,例如将RGB转换为灰度/强度)。

6个回答

38

快速而简单的方法是将灰度强度重复到RGB的每个分量中。因此,如果您有灰度值为120,则转换为RGB(120,120,120)。

这种方式快速而简单,因为您获得的有效亮度取决于您使用的设备的R、G和B子像素的实际亮度。


31

如果你有0到255范围内的灰度值,并且想要产生一个形式为0x00RRGGBB的新值,那么一个快速的方法是:

int rgb = grey * 0x00010101;

或者相应的你选择的语言。


7
直接乘法很好,值得肯定。虽然本能反应是采用位移和按位或操作,但这样做更为简单,而且直接有效。 - Ates Goral
1
或者 rgb = grey << 16 | grey << 8 | grey,其中 << 是有符号左移位运算符,| 是按位或运算符。 - sp00m
它为灰度值220提供了像14474460这样的值。我们如何从中获取R、G和B值? - Sagar Gautam
1
14474460 是 RGB 值。220 是 0xDC,而 14474460 是 0xDCDCDC。 - izb

13

将灰度图转换为RGB很简单。只需使用R = G = B = 灰度值即可。基本思想是,颜色(在RGB显示器上查看)是一种加法系统。

http://en.wikipedia.org/wiki/Additive_color

因此,将红色添加到绿色中会产生黄色。在相等的量中加入一些蓝色混合物,您将得到一种中性颜色。全开[红、绿、蓝]=[255 255 255]会产生白色。[0,0,0]会产生显示器黑色。当R=G=B都相等时,中间值将产生名义上的给定灰度级别的中性颜色。

一个小问题是,取决于您如何查看颜色,它可能不是完全中性的。这将取决于您的监视器(或打印机)的校准方式。从这一点出发,我们可以深入探讨有趣的颜色科学。我就到这里吧。


7

灰度意味着所有值具有相同的强度。将RGB中的所有通道设置为相同的灰度值,您将获得一个RGB黑白图像。


4
不,实际上你不会得到黑白图像。你会得到由不同灰度组成的图像。在更低级别上,实际像素将由红色、绿色和蓝色点组成,它们的强度水平是这样的,以至于从远处观看的人将看到一个中性图像。拿一只放大镜,在显示器上观察名义上为灰色的像素。你会看到由红、绿、蓝三色点组成的复合图像。 - user85109
你说得对,屏幕上呈现的图像将由所有RGB组成,取决于放大倍数。因此,屏幕上会显示所有颜色。我很难理解“你将得到一个由各种灰度组成的图像”与灰度图像有何不同。 - Erik
1
Erik,它们不同,但是“灰度图像”与“黑白图像”相差很大(只有两种颜色)。 - Aistina
10
注意:在口语中,“黑白”意味着“灰度”。 - Stefan Monov

4

将每个像素的R、G和B设置为相同的值(灰度值),这样是否可以得到正确的灰色阴影?


3
不完全是,这取决于您如何看待颜色。您的监视器或打印机是如何校准的?您将在什么样的观看环境中看到这种颜色?如果要打印此颜色,您的打印机是如何校准和特征化的?已使用打印机和任何ICC(国际彩色协会)配置文件的设置是什么?白点?使用什么光源来查看打印品?阳光?D50模拟器灯泡?钨丝灯?大致上,R = G = B = 灰度值是一个不错的起点。这可以让您接近目标。 - user85109

0

您也可以查看我的解决方案{{link1:将RGB8图像转换为RGB32图像的更快的汇编优化方法}}。灰度通道在所有其他通道中简单地重复。

目的是找到使用x86 / SSE进行转换的最快可能的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接