Php imagecreatefrompng()制作黑色背景而不是透明背景?
我使用PHP和GD库制作缩略图,但我的代码将png透明度转换为纯黑色,有没有改进代码的解决方案 这是我的php缩略图生成器代码:Php imagecreatefrompng()制作黑色背景而不是透明背景?,php,gd,thumbnails,Php,Gd,Thumbnails,我使用PHP和GD库制作缩略图,但我的代码将png透明度转换为纯黑色,有没有改进代码的解决方案 这是我的php缩略图生成器代码: function cropImage($nw, $nh, $source, $stype, $dest) { $size = getimagesize($source); $w = $size[0]; $h = $size[1]; switch($stype) { case 'gif':
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);
}
函数cropImage($nw、$nh、$source、$stype、$dest){
$size=getimagesize($source);
$w=$size[0];
$h=$size[1];
交换机($stype){
案例“gif”:
$simg=imagecreatefromformgif($source);
打破
案件‘jpg’:
$simg=imagecreatefromjpeg($source);
打破
案例“png”:
$simg=imagecreatefrompng($source);
打破
}
$dimg=ImageCreateTureColor($nw,$nh);
$wm=$w/$nw;
$hm=$h/$nh;
$h_高度=$nh/2;
$w_高度=$nw/2;
如果($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在ImageCreateTureColor()之后):
有时,如果.jpg图像内部出现小错误(你看不到),所有透明像素都会变成黑色。请尝试使用:
ini_set('gd.jpeg_ignore_warning', 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;
}
?>
如果正确答案的代码无效,请尝试以下操作:
//After imagecreatetruecolor():
$white = imagecolorallocate($dimg, 255, 255, 255);
imagefill($dimg,0,0,$white);
操作顺序很重要。对于.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;
}
这是我的全部测试代码。它适合我
$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);
上面的一些操作使图像的黑色部分变为白色,而有些则根本不起作用。但是,这对我来说是有效的,只需添加以下行:
imagesavealpha($image, true);
以前
imagepng($image)
只是想澄清一下,在上面的代码中,$simage
是imagecreatetruecolor
的输出为我的png工作,但GIF仍然有黑色背景;也不理解第二个案例“png”语句的值。这是必要的吗?我尝试了使用和不使用,并没有发现任何区别。将近9年后,同样的问题出现了仍然在这里…上面的解决方案没有帮助..还有其他建议吗?对于一些图像,你需要先用透明的填充背景,奇怪,但有效
imagepng($image)