Есть задача, конвертировать цвет из формата integer (например синий - 3866879) в формат rgb (59, 0, 255). В переменной $color содержится цвет в формате integer. Использую этот код: $color ='16711680'; $c['r']= $color &0xFF; $c['g']=($color >>8)&0xFF; $c['b']=($color >>16)&0xFF; Проблема заключается в том, что большинство цветов конвертируются правильно, за исключением красного цвета и синего и их оттенков. Например при конвертации красного цвета '16711680' в rgb формате получается синий '0.0.255'. А если поменять местами первое значение с последним т.е. '0' и '255', получится правильный цвет, т.е. красный как и нужно. Может кто нибудь может подсказать в чём может быть проблема? или может быть есть какое-то другое решение? Код должен быть на php. Нужна именно конвертация из формата integer в rgb.Может есть какое то другое решение данной проблемы. Заранее спасибо за помощь.
поменять построчно ключи с РГБ на БГР, например --- Добавлено --- у тебя в инте порядок байт красный-зеленый-синий, судя по всему. значит под синий не надо делать шифт, под зеленый - как сейчас на 8 бит, и красный сдвигать на 16. то есть в твоём коде поменять местами красный с синим.
@Ganzal Смотрите, у меня есть справочник, где хранятся цвета в формате integer, мне нужно вывести эти цвета в табличку в формате HEX. Допустим, если я поменяю эти значения, то остальные цвета же будут некорректно отображаться.Или я вас неправильно понял?
Я не знаю ничего про ваш справочник. Я просто взял заявленный красный в значении 16711680 и увидел что это 0xFF0000 что значит что именно байт с офсетом 2 хранит значение для красного. Следовательно чтоб его выцепить - надо шифтить на 16 бит: Код (Text): $color ='16711680'; $c['r']= ($color >>16)&0xFF; $c['g']=($color >>8)&0xFF; $c['b']=$color &0xFF; А заявленный синий 3866879 это 0x3B00FF что похоже на заявленное rgb (59, 0, 255). То есть предположение про порядок цветов в инте можно считать истиной и патч выше - должен решить проблему с отображением. Если есть код, который из хекса делает инт - там тоже надо проследить правильность упаковки.
@Ganzal Сейчас я поменял местами значения, и теперь беру например коричневый цвет "5935", теперь после конвертации он отображается некорректно, теперь снова нужно менять значения r и b, но как быть, чтобы все цвета отображались корректно?
5935 это 0x00172F что далеко не коричневый. 0x2F1700 похоже на коричневый, но тогда огромный вопрос откуда такой инт и почему он так очевидно противоречит двум заявленным выше значениям красного и синего?
@Ganzal Если честно я сам запутался. У меня есть бд, где хранятся значения в int, там очень много цветов.Это Delphi цвета, вот ссылка откуда я брал код, там как раз про Delphi цвет - https://stackoverflow.com/questions/1125347/convert-a-delphi-tcolor-with-php При конвертации по коду который я прикреплял выше все цвета конвертируются правильно за исключением красного и синего и их оттенков. Если поменять местами r и b то наоборот большинство цветов отображаются неправильно.
Ну если в дельфях ssBBGGRR, то код в первом посте - правильный. Тогда вопрос: откуда такие левые инты для синего и красного заявлены? Дельфи не сможет таких значения вернуть по определению.
@Ganzal Я понял в чем проблема, только непонятно как решить её. Дело в том, что те цвета которые я вам отправлял синий и красный я добавлял при обратной конвертации, значит у меня код для обратной конвертации неправильно работает и добавляются не те значения. Вот тот самый код из HEX в INT: $color = '#0080c0'; function hex2int16($str) { $num = hexdec($str); return ($num & 0x80) ? $num - 65536 : $num; } echo hex2int16($color); Вот пример неправильной конвертации оранжевого цвета, при сохранении такое вот значение -32576.