我在从base64string裁剪图像时遇到问题,它在我的本地主机上运行良好,但是当我将其上传到远程服务器时,透明背景为黑色。
$base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAlongbase64string...."
//see: https://pastebin.com/zqVumGPi for the full base64string
$contentType = explode(':', substr($base64String, 0, strpos($base64String, ';')))[1];
$dataIn = str_replace("data:{$contentType};base64,", '', $base64String);
$dataIn = str_replace(' ', '+', $dataIn);
$dataIn = base64_decode($dataIn);
$src = imagecreatefromstring($dataIn);
$width = 960;
$height = 640;
$dst = imagecreatetruecolor($width, $height);
// Create transparency
imagesavealpha($dst, true);
$color = imagecolorallocatealpha($dst, 0, 0, 0, 127);
imagefill($dst, 0, 0, $color);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $width, $height);
$to_crop_array = array('x' =>intval(187) , 'y' => intval(48), 'width' => 320, 'height'=> 320);
//This is where the transparency disappears on my server.
//It works fine on localhost
$thumb_im = imagecrop($dst, $to_crop_array);
header('Content-Type: image/png');
imagepng($thumb_im);
根据phpInfo,我在本地主机和远程服务器上使用的是PHP版本7.2.1。我在使用的是PHP版本7.2.7-0ubuntu0.18.04.2
本地主机上的GD版本是2.1.0,而在删除服务器上是2.2.5。
本地主机上的LibPNG版本是1.6.27,而在我的远程服务器上,它正在使用1.6.34。 我的服务器在Ubuntu 18.04.1 LTS上运行,由DigitalOcean托管。 我已经在另一台与LibPng和Php具有相同版本的服务器上尝试了此代码,并且运行良好。
答案 0 :(得分:0)
我已经改用Imagick解决了。
这是我的解决方案,如果将来有人会偶然发现这个问题
$contentType = explode(':', substr($base64String, 0, strpos($base64String, ';')))[1];
// Decode base64
$dataIn = str_replace("data:{$contentType};base64,", '', $base64String);
$dataIn = str_replace(' ', '+', $dataIn);
$imageBlob = base64_decode($dataIn);
$imagick = new Imagick();
$imagick->readImageBlob($imageBlob);
$imagick->cropImage(400,400, 30,10);
header('Content-Type: image/'.$imagick->getImageFormat());
echo $imagick->getImageBlob();