Проблема изменения размера PNG и размещения над большим прозрачным фоном в PHP / GD? - PullRequest
1 голос
/ 24 августа 2011

Итак, все работает нормально.У меня есть исходный PNG, изменяющий размеры и правильно расположенный на созданном фоне, но другие области за пределами PNG становятся черными.Я получил прозрачность с помощью imagecolortransparent, но это делает края png неровными.

Вот то, что у меня есть на данный момент, это создание черных полос вокруг PNG.Имейте в виду, что я имею дело ТОЛЬКО с изображениями PNG здесь.

// TARGET IMAGE
$target = imagecreatetruecolor($this->request['width'], $this->request['height']);
imagealphablending($target, false);
imagesavealpha($target, true);

// SOURCE IMAGE
$source = imagecreatefrompng($this->src_image);

// RESAMPLING
imagecopyresampled($target, $source, $offsetX, $offsetY, 0, 0, $tnWidth, $tnHeight, $this->src_width, $this->src_height);

// FINAL IMAGE
imagepng($target, $source, $quality);

// MEMORY CLEAN UP
imagedestroy($source);
imagedestroy($target);

// PRODUCES SOMETHING LIKE THIS

+--------------------------------+
|          BLACK AREA            |
+--------------------------------+
|                                |
|          RESIZED PNG           |
|       WITH TRANSPARENCY        |
|                                |
+--------------------------------+
|          BLACK AREA            |
+--------------------------------+


// WHERE IT SHOULD HAVE THE BLACK AREAS TRANSPARENT AS WELL

+--------------------------------+
|          TRANSPARENT           |
+--------------------------------+
|                                |
|          RESIZED PNG           |
|       WITH TRANSPARENCY        |
|                                |
+--------------------------------+
|          TRANSPARENT           |
+--------------------------------+

Надеюсь, у кого-то есть опыт с этим, потому что все примеры, которые я нашел в Интернете, говорят только о изменении размера PNG на прозрачной BGтот же размер, который легко.

TIA

1 Ответ

0 голосов
/ 25 августа 2011

Ладно, разобрался через много часов.Поэтому я надеюсь, что это поможет другим.

// SOURCE PNG
$src    = imagecreatefrompng($this->src_image);

// DESTINATION CANVAS
$dst = imagecreatetruecolor($canvasW, $canvasH);
imagealphablending($dst, false);
$color = imagecolorallocatealpha($dst, 0, 0, 0, 127);
imagefill($dst, 0, 0, $color);
imagesavealpha($dst, true);

// RESAMPLE/RESIZE SOURCE AND TARGET TOGETHER
imagecopyresampled($dst, $src, $offsetX, $offsetY, 0, 0, $tnWidth, $tnHeight, $this->src_width, $this->src_height);

// WRITE FILE
imagepng($dst, $resized, $quality);

// MEMORY CLEAN UP
imagedestroy($src);
imagedestroy($dst);
...