【问题标题】:Java - Trouble understanding opacity value - parsing 64 bit long to float and adding opacityJava - 无法理解不透明度值 - 解析 64 位长以浮动并添加不透明度
【发布时间】:2019-08-16 09:07:20
【问题描述】:

我试图理解一些从原始颜色值创建不透明度值的代码。

    long fillColorValue = fillColor != null ? Long.parseLong(fillColor) : 0;
    //Set opacity based on alpha
    long alpha = fillColorValue >> 24;
    float opacity = (alpha > 0 ? alpha / 255.0f : 1.0f);
    shape.setFillOpacity(opacity);
  1. 首先将 String 颜色值解析为 long。
  2. 然后,该值的位通过右移移动了 24 位 - 为什么?

long alpha = fillColorValue >> 24;

  1. 然后使用 long 创建一个看似代表不透明度值的浮点数。

浮动不透明度 = (alpha > 0 ? alpha / 255.0f : 1.0f);

如果我能对这种定义不透明度的方法有一些清晰的了解,那就太好了 - 这里实际发生了什么?

形状填充颜色最初由一个字符串值 -1751607581 表示。

【问题讨论】:

  • 您似乎很好地处理了位移,这似乎是一个更困难的概念。你是不熟悉三元运算符(` x ? p : q `),还是问为什么要特别对待零)
  • 或者您可能会问为什么使用 64 位 long,将 24 位移出并显然使用剩余的 40 位?
  • 你知道用的是什么颜色格式吗?可以假设,前 24 位是 RGB(每通道 8 位),其余 40 位是 alpha 通道,但在这种情况下,后续操作看起来很奇怪。
  • 为了从 fillColorValue 中检索整数 Alpha 通道值,您需要将位右移 24。不太确定为什么在 int 足够的情况下将 fillColorValue 和 alpha 变量声明为 long。在您提供的代码中,三元组用于处理 Alpha 值可能为 0 的可能性。奇怪的是,因为 Alpha 值 0 通常意味着 完全透明,但在这种情况下,三元组正在强制执行任何小于 1 的值都会将不透明度设置为完全不透明 (1.0f)。在许多不同的情况下,这当然有充分的理由。
  • 不太熟悉 alpha 和 int/long 到浮点转换的方法对我来说没有多大意义,代码背后的意图也不清楚。正如@DevilsHnd 指出的那样,三元很奇怪,实际上这就是问题所在……透明度显示为完全白色。

标签: java floating-point opacity long-integer


【解决方案1】:

如果颜色以 32 位表示,就像您的示例一样,它看起来像是使用 alpha 通道和三个颜色通道进行编码,每个通道为 8 位(很可能是 ARGB)。

移动 >> 24 从而消除了 RGB 分量,并将 Alpha 通道保持在低位。

但要小心有符号算术!如果原字符串为负数,则fillColorValue为负数,算术运算后保持负数>>移位...

使用alpha > 0 上的守卫,结果是所有负值或空 alpha 值都将被视为不透明。

这意味着在 128 和 255 之间不会有 alpha 值,因此在开区间 ]0.5,1.0[ 中没有 opacity 值。

这听起来很奇怪。也许这就是真正的意图......或者也许颜色在打印到字符串时应该被解释为无符号?

或者 alpha 通道中可能有 9 位,但那将是一种非常不寻常的格式,而且我不认为浪费一半可能的值来编码单个不透明度值......它不会很有道理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2014-01-05
    • 1970-01-01
    • 2010-09-25
    • 2013-06-05
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多