Я делаю миниатюры с использованием библиотеки PHP и GD, но мой код превращает прозрачность png в сплошной черный цвет. Есть ли решение для улучшения моего кода?
это мой код создателя миниатюр php:
function cropImage($nw, $nh, $source, $stype, $dest) { $size = getimagesize($source); $w = $size[0]; $h = $size[1]; switch($stype) { case 'gif': $simg = imagecreatefromgif($source); break; case 'jpg': $simg = imagecreatefromjpeg($source); break; case 'png': $simg = imagecreatefrompng($source); break; } $dimg = imagecreatetruecolor($nw, $nh); $wm = $w/$nw; $hm = $h/$nh; $h_height = $nh/2; $w_height = $nw/2; if($w> $h) { $adjusted_width = $w / $hm; $half_width = $adjusted_width / 2; $int_width = $half_width - $w_height; imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h); } elseif(($w <$h) || ($w == $h)) { $adjusted_height = $h / $wm; $half_height = $adjusted_height / 2; $int_height = $half_height - $h_height; imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h); } else { imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h); } imagejpeg($dimg,$dest,100); }
спасибо
После imagecreatetruecolor ():
<?php // ... Before imagecreatetruecolor() $dimg = imagecreatetruecolor($width_new, $height_new); // png ?: gif // start changes switch ($stype) { case 'gif': case 'png': // integer representation of the color black (rgb: 0,0,0) $background = imagecolorallocate($dimg , 0, 0, 0); // removing the black from the placeholder imagecolortransparent($dimg, $background); case 'png': // turning off alpha blending (to ensure alpha channel information // is preserved, rather than removed (blending with the rest of the // image in the form of black)) imagealphablending($dimg, false); // turning on alpha channel information saving (to ensure the full range // of transparency is preserved) imagesavealpha($dimg, true); break; default: break; } // end changes $wm = $w/$nw; $hm = $h/$nh; // ...
Порядок действий важен. для изображений .gif я обнаружил, что мне нужно сначала скопировать измененное изображение, а затем назначить черный фон прозрачным. для PNG я нашел код, который изменил размер изображений и сохранил фоны прозрачности.
также этот код работал для меня …
$resized_image = imagecreatetruecolor($target_width, $target_height); switch ( $asset->a_mime_type ) { case 'image/jpeg': imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); $r = imagejpeg($resized_image,$file_name); break; case 'image/png': imagealphablending($resized_image, FALSE); imagesavealpha($resized_image, TRUE); imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); $r = @imagepng($resized_image,$file_name); break; case 'image/gif': imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); $background = imagecolorallocate($resized_image, 0, 0, 0); imagecolortransparent($resized_image, $background); $r = @imagegif($resized_image,$file_name); break; }
если код правильного ответа не работает, попробуйте это:
//After imagecreatetruecolor(): $white = imagecolorallocate($dimg, 255, 255, 255); imagefill($dimg,0,0,$white);
Иногда, если изображение .jpg получило небольшие ошибки внутри (вы не можете видеть это), все прозрачные пиксели обращаются к черному цвету. Попытайтесь использовать:
ini_set('gd.jpeg_ignore_warning', 1);
Вот мой общий тестовый код. Меня устраивает
$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION); $filename = 'test.' . $imageFileType; move_uploaded_file($_FILES["image"]["tmp_name"], $filename); $source_image = imagecreatefromjpeg($filename); $source_imagex = imagesx($source_image); $source_imagey = imagesy($source_image); $dest_imagex = 400; $dest_imagey = 600; $dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey); imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey); imagesavealpha($dest_image, true); $trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127); imagefill($dest_image, 0, 0, $trans_colour); imagepng($dest_image,"test1.png",1);
измените rgb на 255, это даст вам прозрачное изображение, а не черное.
<?php switch ($stype) { case "png": // integer representation of the color black (rgb: 0,0,0) $background = imagecolorallocate($simage, 255, 255, 255); // removing the black from the placeholder imagecolortransparent($simage, $background); // turning off alpha blending (to ensure alpha channel information is preserved, rather than removed (blending with the rest of the image in the form of black)) imagealphablending($simage, false); // turning on alpha channel information saving (to ensure the full range of transparency is preserved) imagesavealpha($simage, true); break; case "gif": // integer representation of the color black (rgb: 0,0,0) $background = imagecolorallocate($simage, 255, 255, 255); // removing the black from the placeholder imagecolortransparent($simage, $background); break; } ?>