'imagecolorat' и прозрачность

Как можно получить значение прозрачности пикселя на изображении?

'imagecolorat' выбирает только индекс цвета пикселя в указанном месте изображения. С этим индексом я могу получить значения RGB, но не прозрачный.

Надеюсь, вы понимаете, и спасибо заранее.


person Roman    schedule 18.04.2011    source источник


Ответы (3)


Насколько я знаю, значение прозрачности возвращает функция imagecolorat. Не могли бы вы попробовать:

$color        = imagecolorat($image, $x, $y);
$transparency = ($color >> 24) & 0x7F;

Прозрачность — это целое число от 0 до 127, поэтому нам нужно замаскировать первые 8 бит 32-битного целого числа цвета.

person Stefan Gehrig    schedule 18.04.2011
comment
Ой ну спасибо! Я не знал, что imagecolorat на самом деле содержит альфа-значение. - person Roman; 18.04.2011
comment
Обратите внимание, что 4-й байт отвечает за прозрачность, а не за непрозрачность. Таким образом, 0 означает полностью непрозрачный, а 127 означает полностью прозрачный. В других средах это может быть наоборот, например, в css, где 0.0 полностью прозрачен, а 1.0 полностью непрозрачен. - person Marten Koetsier; 14.11.2018
comment
Насколько велико 32-битное значение? Поскольку imagecolorat возвращает 16777215. - person Edward; 17.08.2020

решение может быть следующим:

$colorIndex = imagecolorat($img, $x, $y);
$colorInfo = imagecolorsforindex($img, $colorIndex);
print_r($colorInfo);

который напечатает что-то вроде:

Array
(
   [red] => 226
   [green] => 222
   [blue] => 252
   [alpha] => 0
)

где [альфа] — ваше значение прозрачности... (от 0 до 127, где 0 — полностью непрозрачно, а 127 — полностью прозрачно)

Наслаждаться!

person shadyyx    schedule 18.04.2011
comment
Да я согласен. Спасибо за ответ. - person Roman; 18.04.2011
comment
хммм, я думал, альфа-значение от 0 до 255, 0 означает прозрачность, а 255 означает отсутствие прозрачности - person user889030; 16.08.2017

В соответствии с руководством по PHP imagecolorat возвращает индекс цвета в указанных координатах X/Y (я предполагаю, что это для GIF и/или PNG-8).

Если вы знаете индекс, то проблема заключается в том, чтобы определить, какой индекс в файле является прозрачным.

imagecolortransparent, возможно, стоит посмотреть, imagecolorsforindex также может быть полезен.

person GordonM    schedule 18.04.2011