【问题标题】:PHP image resize function doesn't work properlyPHP图像调整大小功能无法正常工作
【发布时间】:2011-11-26 03:53:08
【问题描述】:

我想用透明的方式调整图像 PNG 的大小,请帮忙。这是代码:

function createThumb($upfile, $dstfile, $max_width, $max_height){
   $size = getimagesize($upfile);
   $width = $size[0];
   $height = $size[1];
   $x_ratio = $max_width / $width;
   $y_ratio = $max_height / $height;
   if( ($width <= $max_width) && ($height <= $max_height)) {
           $tn_width = $width;
           $tn_height = $height;
   } elseif (($x_ratio * $height) < $max_height) {
           $tn_height = ceil($x_ratio * $height);
           $tn_width = $max_width;
   } else {
           $tn_width = ceil($y_ratio * $width);
           $tn_height = $max_height;
   }
   if($size['mime'] == "image/jpeg"){
           $src = ImageCreateFromJpeg($upfile);
           $dst = ImageCreateTrueColor($tn_width, $tn_height);
           imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height);
           imageinterlace( $dst, true);
           ImageJpeg($dst, $dstfile, 100);
   } else if ($size['mime'] == "image/png"){
        $src = ImageCreateFrompng($upfile);
        $dst = ImageCreateTrueColor($tn_width, $tn_height);
        imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height);

      // integer representation of the color black (rgb: 0,0,0)
     $background = imagecolorallocate($dst, 255, 255, 0);
     // removing the black from the placeholder
     imagecolortransparent($dst, $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($dst, false);

     // turning on alpha channel information saving (to ensure the full range
     // of transparency is preserved)
     imagesavealpha($dst, true);


              Imagepng($dst, $dstfile);

      } else {

           $src = ImageCreateFromGif($upfile);
           $dst = ImageCreateTrueColor($tn_width, $tn_height);
           imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height);
           imagegif($dst, $dstfile);
   }
}

图片来源:

当前结果(我不想要的)是:

如何调整图像大小并保持背景颜色的透明度?需要帮助,请。谢谢。

【问题讨论】:

    标签: php image transparency gd image-resizing


    【解决方案1】:
    <?php
    function createthumb($name, $newname, $new_w, $new_h, $border=false, $transparency=true, $base64=false) {
        if(file_exists($newname))
            @unlink($newname);
        if(!file_exists($name))
            return false;
        $arr = split("\.",$name);
        $ext = $arr[count($arr)-1];
    
        if($ext=="jpeg" || $ext=="jpg"){
            $img = @imagecreatefromjpeg($name);
        } elseif($ext=="png"){
            $img = @imagecreatefrompng($name);
        } elseif($ext=="gif") {
            $img = @imagecreatefromgif($name);
        }
        if(!$img)
            return false;
        $old_x = imageSX($img);
        $old_y = imageSY($img);
        if($old_x < $new_w && $old_y < $new_h) {
            $thumb_w = $old_x;
            $thumb_h = $old_y;
        } elseif ($old_x > $old_y) {
            $thumb_w = $new_w;
            $thumb_h = floor(($old_y*($new_h/$old_x)));
        } elseif ($old_x < $old_y) {
            $thumb_w = floor($old_x*($new_w/$old_y));
            $thumb_h = $new_h;
        } elseif ($old_x == $old_y) {
            $thumb_w = $new_w;
            $thumb_h = $new_h;
        }
        $thumb_w = ($thumb_w<1) ? 1 : $thumb_w;
        $thumb_h = ($thumb_h<1) ? 1 : $thumb_h;
        $new_img = ImageCreateTrueColor($thumb_w, $thumb_h);
    
        if($transparency) {
            if($ext=="png") {
                imagealphablending($new_img, false);
                $colorTransparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127);
                imagefill($new_img, 0, 0, $colorTransparent);
                imagesavealpha($new_img, true);
            } elseif($ext=="gif") {
                $trnprt_indx = imagecolortransparent($img);
                if ($trnprt_indx >= 0) {
                    //its transparent
                    $trnprt_color = imagecolorsforindex($img, $trnprt_indx);
                    $trnprt_indx = imagecolorallocate($new_img, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
                    imagefill($new_img, 0, 0, $trnprt_indx);
                    imagecolortransparent($new_img, $trnprt_indx);
                }
            }
        } else {
            Imagefill($new_img, 0, 0, imagecolorallocate($new_img, 255, 255, 255));
        }
    
        imagecopyresampled($new_img, $img, 0,0,0,0, $thumb_w, $thumb_h, $old_x, $old_y);
        if($border) {
            $black = imagecolorallocate($new_img, 0, 0, 0);
            imagerectangle($new_img,0,0, $thumb_w, $thumb_h, $black);
        }
        if($base64) {
            ob_start();
            imagepng($new_img);
            $img = ob_get_contents();
            ob_end_clean();
            $return = base64_encode($img);
        } else {
            if($ext=="jpeg" || $ext=="jpg"){
                imagejpeg($new_img, $newname);
                $return = true;
            } elseif($ext=="png"){
                imagepng($new_img, $newname);
                $return = true;
            } elseif($ext=="gif") {
                imagegif($new_img, $newname);
                $return = true;
            }
        }
        imagedestroy($new_img);
        imagedestroy($img);
        return $return;
    }
    //example useage
    createthumb("1.png", "2.png", 64,64,true, true, false);
    ?>
    

    希望这可以帮助... 这段代码我不值得称赞...刚刚发现它在网上...享受

    【讨论】:

      【解决方案2】:

      imagecopyresampled 放错地方了。这应该在您设置背景颜色之后调用

      $src = ImageCreateFrompng($upfile);
      $dst = ImageCreateTrueColor($tn_width, $tn_height);
      
      // use imagecolorallocatealpha to set BG as transparent:
      $background = imagecolorallocatealpha($dst, 255, 255, 255, 127);
      
      // turning off alpha blending as it's not needed
      imagealphablending($dst, false);
      
      // turning on alpha channel information saving (to ensure the full range
      // of transparency is preserved)
      imagesavealpha($dst, true);
      
      // Do this here!
      imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height);
      
      Imagepng($dst, $dstfile);
      

      【讨论】:

      • 为我工作。你有任何错误吗?你把代码放在正确的地方了吗?我的代码 sn-p 应该替换您在 } else if ($size['mime'] == "image/png"){ 和下一个 } else { 之间的所有内容
      • 这对我不起作用你用我的帖子的标志测试过代码吗?
      • 是的。我已经上传了我使用的完整 php 脚本到我的 Dropbox:createThumb.php,我也上传了结果:CcbUq_thumb.png。您能否更具体地说明尝试时会发生什么?您是在删除了透明度的图像,还是收到了错误消息?
      猜你喜欢
      • 2017-08-24
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多