为了账号安全,请及时绑定邮箱和手机立即绑定

imagecreatefrompng()使背景变成黑色而不是透明?

imagecreatefrompng()使背景变成黑色而不是透明?

PHP
长风秋雁 2019-11-29 15:29:03
我使用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);}谢谢
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

在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);


        // 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;


// ...


查看完整回答
反对 回复 2019-11-29
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

操作顺序很重要。对于.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;

}


查看完整回答
反对 回复 2019-11-29
?
守候你守候我

TA贡献1802条经验 获得超10个赞

这是我的总测试代码。这个对我有用


$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);


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 1723 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信