PHP Image Resize and Expand Placeholder (Прозрачный) - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь изменить размер вертикального прозрачного изображения в формате png и сделать заполнитель квадратным (прозрачный фон).

Sample Image

В результате я получаю прозрачное изображение, но черный слева и справа от заполнителя (черный-прозрачный-черный). Помогите, чтобы вся область заполнителя была прозрачной, спасибо.

$info = getimagesize($source);
$imgtype = image_type_to_mime_type($info[2]);

switch ($imgtype) {
    case 'image/jpeg':
        $src_image = imagecreatefromjpeg($source);
        break;
    case 'image/gif':
        $src_image = imagecreatefromgif($source);
        break;
    case 'image/png':
        $src_image = imagecreatefrompng($source);
        break;
    default:
        die('Invalid image type.');
}

$new_w = 300;
$new_h = 300;

$src_x = 0;
$src_y = 0;
$src_w = imagesx($src_image);
$src_h = imagesy($src_image);

$dst_h = round($new_h);
$dst_w = round(($dst_h / $src_h) * $src_w);
$dst_y = 0;
$dst_x = ($new_w - $dst_w) / 2;

$dst_image = imagecreatetruecolor($new_w, $new_h);
$alphacolor = imagecolorallocate($dst_image, 255, 255, 255);
imagecolortransparent($dst_image, $alphacolor);

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

imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

imagepng($dst_image, $destination, 0);

1 Ответ

0 голосов
/ 14 января 2019

Наконец-то добейся работы:

  • Использование imagecolorallocatealpha вместо imagecolorallocate
  • Использование imagefilledrectangle вместо imagecolortransparent
  • Установка режима смешивания на false и флаг сохранения альфа-канала на true перед выполнением функции imagecolorallocate ().

Рабочий код :

$info = getimagesize($source);
$imgtype = image_type_to_mime_type($info[2]);

switch ($imgtype) {
    case 'image/jpeg':
        $src_image = imagecreatefromjpeg($source);
        break;
    case 'image/gif':
        $src_image = imagecreatefromgif($source);
        break;
    case 'image/png':
        $src_image = imagecreatefrompng($source);
        break;
    default:
        die('Invalid image type.');
}

$src_x = 0;
$src_y = 0;
$src_w = imagesx($src_image);
$src_h = imagesy($src_image);

$dst_h = round($new_h);
$dst_w = round(($dst_h / $src_h) * $src_w);
$dst_y = 0;
$dst_x = ($new_w - $dst_w) / 2;

$dst_image = imagecreatetruecolor($new_w, $new_h);

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

$alphacolor = imagecolorallocatealpha($dst_image, 255, 255, 255, 127);
imagefilledrectangle($dst_image, 0, 0, $new_w, $new_h, $alphacolor);

imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

imagepng($dst_image, $destination, 0);
...