如何获得8位色彩?

4

此时,我有一个生成三个随机整数的方法,范围是0到255。

我使用这三个整数来表示颜色:红色、绿色和蓝色。

如果我想要用这些生成的颜色来设置某物的颜色,我会使用以下代码:

 Color.argb(255, r, g, b); //255 =max intensity and after ,there are red green blue

我需要做的是将这3个整数或者强度值转换为8位整数。

如果有任何文档或指导,我都非常感激!

如果需要更多信息,我会在评论或修改问题正文。


请看这里,http://stackoverflow.com/questions/14775442/relative-8-bit-color-of-a-16-bit-conversion - user902383
将24位数据放入8位空间中,您将会丢失信息。一些系统使用调色板(颜色查找表)尽可能接近原始颜色(GIF可以做到这一点)。 - Andy Newman
将RGB值转换成整数像素。 - sravtej
使用8位将无论如何会丢失一些关于颜色方面的数据。这就是你可以获得的64种颜色的“美丽之处”。 - user3130569
是的,我知道这个...但我的雇主想要8位... - Vlad
1个回答

8
您可以按以下方式对颜色进行编码:
Bits    0### 1### 2### 3### 4### 5### 6### 7###
        Alpha---- Red------ Green---- Blue-----

请注意,您将失去有关颜色的大量信息(但我认为这正是您想获得的内容)。
为了进行编码,您需要执行以下操作:
- 更改颜色范围(从0-2550-3)。 - 适当移动颜色并将它们添加在一起以获取8位值。
下面是一些示例代码:
import java.awt.Color;

abstract class EightBit {
  public static int fromColor(Color c) {
    return ((c.getAlpha() >> 6) << 6)
         + ((c.getRed()   >> 6) << 4)
         + ((c.getGreen() >> 6) << 2)
         +  (c.getBlue()  >> 6);
  }
  public static Color toColor(int i) {
    return new Color(((i >> 4) % 4) * 64,
                     ((i >> 2) % 4) * 64,
                      (i       % 4) * 64,
                      (i >> 6)      * 64);
  }
}

说明

编码

让我们从一个例子颜色开始:new Color(200, 59, 148, 72)。现在我们将把它转换为整数。该颜色的二进制表示是:

Alpha 200 -- 11001000
Red    59 -- 00111011
Green 148 -- 10010100
Blue   72 -- 01001000

现在,我们将它们向右移6位(所以我们得到了前2位):
Alpha 3 -- 11
Red   0 -- 00
Green 2 -- 10
Blue  1 -- 01

现在我们把它们放在一起:
Bits  [ 1 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ] -- 209
       ALPHA---  RED-----  GREEN---  BLUE----

这是个209。看到了吗?

解码

现在我们回到8位数字:209。我们想要解码它。首先,我们需要通过将其向右移位并模4来取回2位颜色:

Bits  [ 1 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ]
      \_shift_by_6_bits_____________[ 1 ][ 1 ] -- 3 (Alpha)
                \_by_4_bits_________[ 0 ][ 0 ] -- 0 (Red)
                          \_by_2____[ 1 ][ 0 ] -- 2 (Green)
                   shift by 0 bits: [ 0 ][ 1 ] -- 1 (Blue)

现在我们将它们乘以64:
3 * 64 = 192 (Alpha)
0 * 64 =   0 (Red)
2 * 64 = 128 (Green)
1 * 64 =  64 (Blue)

将它们放回到Color对象中。如您所见,颜色是不同的:在此过程中丢失了一些关于颜色的信息。这被称为有损压缩


你能否给我解释一下整个过程?我相当确定我理解了它的工作原理,但我想确保我没有使用误解的概念。总之,它看起来是我需要的东西。我将立即进行测试,并检查答案是否正确。(只要您解释一下您所做的事情,我会给您点赞的) - Vlad
翻译:解释已完成!请确保接受答案(及其详尽的解释)。 - user3130569

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