За последние 24 часа нас посетили 21946 программистов и 1103 робота. Сейчас ищут 719 программистов ...

Конвертация цвета из формата integer в rgb на php

Тема в разделе "PHP для новичков", создана пользователем Minvaliev, 10 авг 2018.

Метки:
  1. Minvaliev

    Minvaliev Новичок

    С нами с:
    10 авг 2018
    Сообщения:
    5
    Симпатии:
    0
    Есть задача, конвертировать цвет из формата 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.Может есть какое то другое решение данной проблемы. Заранее спасибо за помощь.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    поменять построчно ключи с РГБ на БГР, например
    --- Добавлено ---
    у тебя в инте порядок байт красный-зеленый-синий, судя по всему. значит под синий не надо делать шифт, под зеленый - как сейчас на 8 бит, и красный сдвигать на 16. то есть в твоём коде поменять местами красный с синим.
     
  3. Minvaliev

    Minvaliev Новичок

    С нами с:
    10 авг 2018
    Сообщения:
    5
    Симпатии:
    0
    @Ganzal Смотрите, у меня есть справочник, где хранятся цвета в формате integer, мне нужно вывести эти цвета в табличку в формате HEX. Допустим, если я поменяю эти значения, то остальные цвета же будут некорректно отображаться.Или я вас неправильно понял?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Я не знаю ничего про ваш справочник. Я просто взял заявленный красный в значении 16711680 и увидел что это 0xFF0000 что значит что именно байт с офсетом 2 хранит значение для красного. Следовательно чтоб его выцепить - надо шифтить на 16 бит:
    Код (Text):
    1.  
    2.  
    3. $color ='16711680';
    4.  
    5. $c['r']= ($color >>16)&0xFF;
    6. $c['g']=($color >>8)&0xFF;
    7. $c['b']=$color &0xFF;
    А заявленный синий 3866879 это 0x3B00FF что похоже на заявленное rgb (59, 0, 255). То есть предположение про порядок цветов в инте можно считать истиной и патч выше - должен решить проблему с отображением.
    Если есть код, который из хекса делает инт - там тоже надо проследить правильность упаковки.
     
  5. Minvaliev

    Minvaliev Новичок

    С нами с:
    10 авг 2018
    Сообщения:
    5
    Симпатии:
    0
    @Ganzal Сейчас я поменял местами значения, и теперь беру например коричневый цвет "5935", теперь после конвертации он отображается некорректно, теперь снова нужно менять значения r и b, но как быть, чтобы все цвета отображались корректно?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    5935 это 0x00172F что далеко не коричневый. 0x2F1700 похоже на коричневый, но тогда огромный вопрос откуда такой инт и почему он так очевидно противоречит двум заявленным выше значениям красного и синего?
     
  7. Minvaliev

    Minvaliev Новичок

    С нами с:
    10 авг 2018
    Сообщения:
    5
    Симпатии:
    0
    @Ganzal Если честно я сам запутался. У меня есть бд, где хранятся значения в int, там очень много цветов.Это Delphi цвета, вот ссылка откуда я брал код, там как раз про Delphi цвет - https://stackoverflow.com/questions/1125347/convert-a-delphi-tcolor-with-php
    При конвертации по коду который я прикреплял выше все цвета конвертируются правильно за исключением красного и синего и их оттенков. Если поменять местами r и b то наоборот большинство цветов отображаются неправильно.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Ну если в дельфях ssBBGGRR, то код в первом посте - правильный. Тогда вопрос: откуда такие левые инты для синего и красного заявлены? Дельфи не сможет таких значения вернуть по определению.
     
  9. Minvaliev

    Minvaliev Новичок

    С нами с:
    10 авг 2018
    Сообщения:
    5
    Симпатии:
    0
    @Ganzal Я понял в чем проблема, только непонятно как решить её. Дело в том, что те цвета которые я вам отправлял синий и красный я добавлял при обратной конвертации, значит у меня код для обратной конвертации неправильно работает и добавляются не те значения. Вот тот самый код из HEX в INT:

    $color = '#0080c0';
    function hex2int16($str) {
    $num = hexdec($str);
    return ($num & 0x80) ? $num - 65536 : $num;
    }
    echo hex2int16($color);
    Вот пример неправильной конвертации оранжевого цвета, при сохранении такое вот значение -32576.