Java - Проблемы с пониманием значения непрозрачности - парсинг 64-битной длины и добавление непрозрачности - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь понять некоторый код, который создает значение непрозрачности из исходного значения цвета.

    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;

затем long используется для создания float, представляющего значение непрозрачности.

непрозрачность float = (alpha> 0? Alpha / 255.0f: 1.0f);

Было бы замечательно, если бы у меня была некоторая ясность в этом методе определения непрозрачности - что на самом деле здесь происходит?

Цвет заливки формы первоначально представлен значением String -1751607581.

1 Ответ

1 голос
/ 27 марта 2019

Если цвет представлен в 32 битах, как кажется в вашем примере, похоже, что он закодирован альфа-каналом и тремя цветовыми каналами, каждый из которых состоит из восьми битов (наиболее вероятно, ARGB).

Shifting >> 24, таким образом, устраняются компоненты RGB и сохраняются альфа-каналы в младших битах.

Но остерегайтесь подписанной арифметики! если исходная строка имеет отрицательное число, то fillColorValue будет отрицательным и останется отрицательным после арифметики >> shift ...

С защитой на alpha > 0 следствием является то, что все отрицательные или нулевые альфа-значения будут считаться непрозрачными.

Это означает, что между 128 и 255 не будет значения alpha, поэтому в открытом интервале значение opacity не будет] 0,5,1,0 [.

Звучит странно. Может быть, это и есть истинное намерение ... Или, может быть, цвет должен был быть интерпретирован без знака при печати в строку?

Или, может быть, в альфа-канале 9 битов, но тогда это будет очень необычный формат, и я не вижу смысла тратить половину возможных значений для кодирования одного значения непрозрачности ... Это не делает здравый смысл.

...