【问题标题】:How does Java handle alpha channel?Java 如何处理 alpha 通道?
【发布时间】:2017-10-06 02:08:56
【问题描述】:

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

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

【问题讨论】:

    标签: java encoding argb


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是一个有趣的问题,归结为整数文字的定义。如需完整参考,请参阅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);
      

      两行都会输出真值。

      【讨论】:

        【解决方案3】:

        intInteger 是有符号的,你使用的十六进制符号是无符号的。

        EG 试试这样的:

        System.out.printf( "%x%n",  -1 );
        

        将输出:

        ffffffff

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-13
          • 2019-08-30
          相关资源
          最近更新 更多