Tengo un pequeño problema, estoy creando un sistema que procese las imagenes enviadas de un formulario y las suba. Si las imagenes PNG tienen transparencias las quiero conservar, y de hecho lo consigo pero a medias, me explico, la imagen es trasparenete pero alrededor d ela parte no transparente se crea un halo/linea negro muy extraño y que por más que prueba cosas, no doy con la solución.
Este es el código:
Código PHP:
$what = getimagesize($imgUrl);
switch(strtolower($what['mime']))
{
case 'image/png':
$img_r = imagecreatefrompng($imgUrl);
$source_image = imagecreatefrompng($imgUrl);
$type = '.png';
break;
case 'image/jpeg':
$img_r = imagecreatefromjpeg($imgUrl);
$source_image = imagecreatefromjpeg($imgUrl);
error_log("jpg");
$type = '.jpeg';
break;
case 'image/gif':
$img_r = imagecreatefromgif($imgUrl);
$source_image = imagecreatefromgif($imgUrl);
$type = '.gif';
break;
default: die('Tipo de imagen no soportada');
}
//Comprobando escritura de acceso al directorio
if(!is_writable(dirname($output_filename))){
$response = Array(
"status" => 'error',
"message" => 'No se puede recortar el archivo'
);
}else{
// Cambiar el tamaño original por el tamaño del editor
$resizedImage = imagecreatetruecolor($imgW, $imgH);
imagecopyresampled($resizedImage, $source_image, 0, 0, 0, 0, $imgW, $imgH, $imgInitW, $imgInitH);
// Rotar la imagen
$rotated_image = imagerotate($resizedImage, -$angle, 0);
// Nueva anchura y altura de la imagen rotada
$rotated_width = imagesx($rotated_image);
$rotated_height = imagesy($rotated_image);
// diferencia entre los tamaños rotados y los originales
$dx = $rotated_width - $imgW;
$dy = $rotated_height - $imgH;
// crop de la iamgen rotada para encajar el rectangulo
$cropped_rotated_image = imagecreatetruecolor($imgW, $imgH);
imagecolortransparent($cropped_rotated_image, imagecolorallocate($cropped_rotated_image, 0, 0, 0));
imagecopyresampled($cropped_rotated_image, $rotated_image, 0, 0, $dx / 2, $dy / 2, $imgW, $imgH, $imgW, $imgH);
// crop de la imagen en el area seleccionada
$final_image = imagecreatetruecolor($cropW, $cropH);
imagecolortransparent($final_image, imagecolorallocate($final_image, 0, 0, 0));
imagecopyresampled($final_image, $cropped_rotated_image, 0, 0, $imgX1, $imgY1, $cropW, $cropH, $cropW, $cropH);
// Salida final imagen png
imagepng($final_image, $output_filename.$type, $png_quality);
//imagejpeg($final_image, $output_filename.$type, $jpeg_quality);
$response = Array(
"status" => 'success',
"url" => $output_filename.$type
);
}
Saludos! :)