Объединить два изображения с прозрачными пленками в PHP - PullRequest
4 голосов
/ 23 июня 2011

Я пытаюсь создать составное изображение из нескольких .png с фоновой прозрачностью через php и сохранить полученное изображение в моей базе данных.Моя проблема в том, что прозрачные участки моих изображений удаляются при объединении изображений.

Это мой код для создания составного изображения:

    $base = imagecreatefrompng('application/assets/images/vel1_bg.png');
    imagealphablending($base, true);
    list($baseWidth, $baseHeight, $type, $attr) = getimagesize('application/assets/images/vel1_bg.png');

    $user_board_items = $this->config->item('user_board_items');

    foreach($array as $key => $value){
        $item = imagecreatefrompng('application/assets/images/items/' . $user_board_items[$value[0]] . '.png');         
        imagealphablending($item, true);
        list($width, $height, $type, $attr) = getimagesize('application/assets/images/items/'. $user_board_items[$value[0]] . '.png');

        imagecopymerge($base,
                    $item,
                    floor(($value[1] / 100) * $baseWidth),
                    floor(($value[2] / 100) * $baseHeight),
                    0,
                    0,
                    $width,
                    $height,
                    100);
        imagedestroy($item);
    }

    //We have to capture the output buffer
    ob_start();
    imagepng($base);
    $baseimg = ob_get_clean();

Это создает изображение, подобное этому: enter image description here

И я ищу что-то похожее на это: enter image description here (обратите внимание, как представлены прозрачные секции)

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

Не используйте imagecopymerge () для слияния прозрачного изображения.

Лучше использовать imagecopyresampled () в вашем скрипте.

0 голосов
/ 05 декабря 2013

Как упоминалось ранее, imagecopyresampled работал для меня также после нескольких часов пробовать разные решения. Параметры, которые должны быть переданы, остаются теми же, за исключением того, что вы должны удалить последний, но добавить ширину и высоту источника. Ваш звонок, вероятно, будет:

  imagecopyresampled($base,
                $item,
                floor(($value[1] / 100) * $baseWidth),
                floor(($value[2] / 100) * $baseHeight),
                0,
                0,
                $width,
                $height,
                $width,
                $height);
...