Заполните прозрачность png цветом фона - PullRequest
0 голосов
/ 21 сентября 2018

Я занимаюсь рефакторингом старой библиотеки обрезки / изменения размера изображений, которую я написал около 5 лет назад, и застрял, пытаясь восстановить одну из ее функциональных возможностей.Самое смешное, что я даже не уверен, что это сработало тогда, потому что я, вероятно, никогда не использовал его.

Мне нужно иметь возможность работать с изображениями png, сохраняя прозрачность (что работает), но я такжеЯ не смог бы заполнить прозрачную часть изображения цветом.

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

Вот упрощенная версия моего кода:

 <?php

$src = imagecreatefrompng($pathToSomePngFile);

imagealphablending($src, false);
imagesavealpha($src, true);

$output = imagecreatetruecolor($width, $height);

if ($backgroundColor) {
    $fillColor = imagecolorallocate(
        $output, 
        $backgroundColor['r'], 
        $backgroundColor['g'], 
        $backgroundColor['b']
    );

    imagefilledrectangle(
        $output, 
        0, 
        0, 
        $width, 
        $height, 
        $fillColor
    );
} else {
    imagealphablending($output, false);
    imagesavealpha($output, true);
}

imagecopyresampled(
    $output,
    $src,
    0,
    0,
    0,
    0,
    $width,
    $height,
    $width,
    $height
);

imagepng($output, $pathToWhereImageIsSaved);

ОБНОВЛЕНИЕ

Обновлено с решением delboy1978uk, чтобы заставить его работать безизменить мои другие настройки.

1 Ответ

0 голосов
/ 21 сентября 2018

Как-то так должно работать.

<?php

// open original image
$img = imagecreatefrompng($originalTransparentImage);
$width  = imagesx($img);
$height = imagesy($img);

// make a plain background with the dimensions
$background = imagecreatetruecolor($width, $height);
$color = imagecolorallocate($background, 127, 127, 127); // grey background
imagefill($background, 0, 0, $color);

// place image on top of background
imagecopy($background, $img, 0, 0, 0, 0, $width, $height);

//save as png
imagepng($background, '/path/to/new.png', 0);
...