Java - 无法理解不透明度值 - 解析64位长以浮动并添加不透明度

问题描述 投票:0回答:1

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

    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用于创建一个看似代表不透明度值的浮点数。

float opacity =(alpha> 0?alpha / 255.0f:1.0f);

如果我可以清楚地了解这种定义不透明度的方法,那会很棒 - 这里究竟发生了什么?

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

java floating-point opacity long-integer
1个回答
1
投票

如果颜色以32位表示,就像你的例子似乎,它看起来像是用alpha通道和三个颜色通道编码,每个通道都是8位(最有可能是ARGB)。

因此,移动>> 24可以消除RGB分量,并将alpha通道保持在低位。

但要注意签名算术!如果原始字符串是负数,则fillColorValue将为负数,并且在算术>>移位后保持为负数...

随着alpha > 0的守卫,结果是所有负的或零的α值将被视为不透明。

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

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

或者也许在alpha通道中有9位,但那时它将是一种非常不寻常的格式,并且我没有看到浪费一半可能的值来编码单个不透明度值...这没有多大意义。

© www.soinside.com 2019 - 2024. All rights reserved.