Смешивание цветов GD — PHP

#php #gd

#php #gd

Вопрос:

Хорошо, у меня есть изображение размером 64×64 пикселя, некоторые пиксели белые, некоторые серые, а некоторые более темные, поэтому у меня есть другое изображение размером 64×64 пикселя с несколькими желтыми пикселями, которые будут определять, какие пиксели первого изображения должны быть изменены. Пока что я мог бы изменить цвета на первом изображении с помощью следующего кода, но дело в том, что я понятия не имею, как «смешать» данный цвет с цветами, которые уже были на первом изображении.

Например, если пиксель белый (255,255,255), а новый цвет красный (255,0,0), результатом будет (255,0,0), но если пиксель немного темнее, новый красный цвет также должен быть темнее. Есть идеи?

 $image = 'o1.png';
$overlay = 'o2.png';

$background = imagecreatefrompng($image);

imagealphablending($background, true);

// Create overlay image
$overlay = imagecreatefrompng($overlay);

// get size
$size = getimagesize("o2.png");
$L=$size[0];
$H=$size[1];

for($j=0;$j<$H;$j  ){
    for($i=0;$i<$L;$i  ){

        $rgb = imagecolorat($overlay, $i, $j);

        $red = (isset($_GET['r']) ? $_GET['r'] : 0);
        $green = (isset($_GET['g']) ? $_GET['g'] : 0);
        $blue = (isset($_GET['b']) ? $_GET['b'] : 0);

        $r = ($rgb >> 16) amp; 0xFF;
        $g = ($rgb >> 8) amp; 0xFF;
        $b = $rgb amp; 0xFF;

        if(($r==255)amp;amp;($g==255)amp;amp;($b==0)) {

            $color = imagecolorallocate($background, $red, $green, $blue);
            imagesetpixel($background, $i, $j, $color);

        }

    }
}


header("Content-type: image/png");
header("Content-Disposition: filename=" . $image);

imagepng($background);

// Destroy the images
imagedestroy($background);
imagedestroy($overlay);
  

Комментарии:

1. Почему бы вместо этого просто не объединить альфа-изображение поверх?

2. Я пробовал, но проблема в том, что я никогда не получу правильный цвет, потому что это зависит от прозрачности%, я надеялся на какой-то код для «суммирования» обоих цветов и получения цвета в зависимости от исходного пикселя на первом изображении. Если прозрачность слишком низкая, темные части исходного изображения не будут заметны, если она слишком высокая, новый цвет, например красный, будет больше похож на оранжевый, чем на красный.

3. Да, конечно … это то, к чему приведет слияние альфа-изображения сверху. В чем ваш вопрос?

4. Да, но разве вам не нужно устанавливать для этого уровень прозрачности? Если прозрачность слишком низкая, темные части исходного изображения не будут заметны, если она слишком высокая, новый цвет, например красный, будет больше похож на оранжевый, чем на красный.

5. Да, разве это не то, чего вы хотите? Я понятия не имею, о чем вы просите, если вы просите о чем-то другом, кроме смешивания двух изображений размером 64×64 пикселя, учитывая, что именно об этом говорится в заголовке и теле вашего поста. Можете ли вы что-нибудь уточнить?

Ответ №1:

Я думаю, вы говорите о режиме многократного наложения. Согласно Википедии, формула для этого такова:

Цвет результата = (верхний цвет) * (Нижний цвет) /255

Используя эту формулу, результирующее изображение будет темнее там, где цвет фона темнее.

Комментарии:

1. Это может быть неочевидно, но формула должна применяться к каждому компоненту цвета (т. Е. красному, зеленому, синему) отдельно (поскольку я подумал, что мне нужно умножить 0xFFFFFF на 0xFF3333 , что не является таким же жестким, выглядит несколько похожим)