Почему imagecrop удаляет прозрачность? - PullRequest
0 голосов
/ 19 февраля 2019

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

После этого я сначала попытался обрезать изображение и сделать обрезанное изображение его фоном, прозрачным, как я делал ранее с исходным изображением.,С исходным изображением оно работало нормально, но тот же метод не работает для обрезанного изображения.

header('Content-Type: image/png');

// Image resource
$image = imagecreatefrompng("/var/www/html".$_GET["image"]);

// STEP 1 Make background transparant
$white = imagecolorexact($image, 255, 255, 255); 
imagecolortransparent($image, $white);  

// STEP 2 Crop the image
$image = imagecrop($image, ['x' => 15, 'y' => 49, 'width' => 382, 'height' => 382]);

// Serve the image
imagepng($image);
imagedestroy($image);

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

Я также попытался повторно скопировать imagecopy вместо imagecrop с теми же результатами.Также переключил шаги безрезультатно.

header('Content-Type: image/png');

// Image resources
$image = imagecreatefrompng("/var/www/html".$_GET["image"]);  
$new = imagecreatetruecolor(382, 382);

// STEP 1 Make background transparant
$white = imagecolorexact($image, 255, 255, 255); 
imagecolortransparent($image, $white);  

// STEP 2 Crop the image
imagecolortransparent($new, imagecolorallocatealpha($new, 255, 255, 255, 127));
imagealphablending($new, false);
imagesavealpha($new, true);
imagecopyresampled($new, $image, 0, 0, 15, 49, 382, 382, 382, 382);

// Serve the image
imagepng($new);
imagedestroy($new);

Почему это не работает так, как я ожидал?

1 Ответ

0 голосов
/ 19 февраля 2019

Теперь все работает ... Я думаю, что проблема заключается в палитре миксов и изображениях с истинным цветом, как сказал 04FS.

function setTransparency($new_image,$image_source) {
  $transparencyIndex = imagecolortransparent($image_source); 
  $transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255); 

  if ($transparencyIndex >= 0) { 
    $transparencyColor = imagecolorsforindex($image_source, $transparencyIndex);    
  } 

  $transparencyIndex = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']); 
  imagefill($new_image, 0, 0, $transparencyIndex); 
  imagecolortransparent($new_image, $transparencyIndex);
}

// Image resource
$image = imagecreatefrompng("/var/www/html".$_GET["image"]); 
$imageNew = imagecreatetruecolor(382, 382);

setTransparency($imageNew, $image);

imagecopyresampled($imageNew, $image, 0, 0, 15, 49, 382, 382, 382, 382);

// Serve the image
header('Content-Type: image/png');
imagepng($imageNew);
imagedestroy($imageNew);
...