Java如何处理alpha通道?

时间:2017-10-06 02:08:56

标签: java encoding argb

我的理解是带有alpha值示例的RGB值可以是0xffhexcode

然而,我无法理解的是0xff0000ff,一个具有最大alpha值的纯蓝色,是一个大于Integer.MAX_VALUE的整数值。 Java中的下划线编码如何允许这种情况发生?

3 个答案:

答案 0 :(得分:2)

实际上像素的范围是整数最大值的两倍,因为整数是有符号的,像素是无符号整数。所以有些颜色有负整数值。例如。白= -1

答案 1 :(得分:1)

IntegerSystem.out.printf( "%x%n", -1 ); 已签名,您使用的十六进制表示法是无符号的。

EG尝试这样的事情:

{{1}}

将输出:

  

FFFFFFFF

答案 2 :(得分:1)

这是一个有趣的问题,归结为整数文字的定义。有关完整参考,请参阅https://docs.oracle.com/javase/specs/jls/se9/html/jls-3.html#jls-3.10.1

上的语言规范

问题的关键在于,对于以小数表示的整数文字,您只能表示正整数。使用十六进制文字,您可以表达正面和负面的值。具体而言,如果第一位开启,该值将为负。

引用语言规范:

  

十进制数字是单个ASCII数字0,表示   整数零,或者由1到9的ASCII数字组成   其次是一个或多个从0到9的ASCII数字穿插   下划线,表示正整数。

     

十六进制数字由前导ASCII字符0x或组成   0X后跟一个或多个穿插的ASCII十六进制数字   下划线,可以表示正整数,零整数或负整数。

因此准确地说,0xffffffff实际上并不大于Integer.MAX_VALUE,因为它是负的(由于前导位开启)。乍一看,你可以尝试一些看起来不对劲的东西:

    System.out.println(Integer.MAX_VALUE == 0x7fffffff);
    System.out.println(Integer.MIN_VALUE == 0x80000000);

这两行都会输出true。