在PHP中调整图像大小,保持比例,透明度和居中

时间:2010-11-09 12:49:01

标签: php image-resizing

如何在PHP中调整图像大小,保持宽高比,如果文件是gifpng图像,则透明度,然后根据最终大小垂直或水平居中图像?

6 个答案:

答案 0 :(得分:2)

有几个技巧。这是我的功能:

function im_resize($file_src,$file_dest,$wd,$hd) {

  if (!file_exists($file_src)) return false;

  $size = getimagesize($file_src);
  if ($size === false) return false;

  if ($size['mime']=='image/pjpeg') $size['mime'] = 'image/jpeg';

  $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
  $destformat = strtolower(substr($file_dest, -4));
  $icfunc = "imagecreatefrom" . $format;
  if (!function_exists($icfunc)) return false;

  $src = $icfunc($file_src);

  $ws = imagesx($src);
  $hs = imagesy($src);

  if ($ws >= $hs) {
    $hd = ceil(($wd * $hs) / $ws);
  }
  else {
    $wd =  ceil(($hd*$ws)/$hs);
  }
  if ($ws <= $wd) {
    $wd = $ws;
    $hd = $hs;
  }
  $wc=($wd * $hs) / $hd;

  if ($wc<=$ws) {
    $hc=($wc * $hd) / $wd;
  }
  else {
    $hc=($ws * $hd) / $wd;
    $wc=($wd * $hc) / $hd;
  }

  $dest = imagecreatetruecolor($wd,$hd);
  switch ($format) {
    case "png":
      imagealphablending( $dest, false );
      imagesavealpha( $dest, true );
      $transparent = imagecolorallocatealpha($dest, 255, 255, 255, 127);
      imagefilledrectangle($dest, 0,  0, $nw, $nh,  $transparent);

      break;
    case "gif":
      // integer representation of the color black (rgb: 0,0,0)
      $background = imagecolorallocate($src, 0, 0, 0);
      // removing the black from the placeholder
      imagecolortransparent($src, $background);

      break;
  }

  imagecopyresampled($dest,$src,0,0,($ws-$wc)/2,($hs-$hc)/2, $wd, $hd, $wc, $hc);

  if (!isset($q)) $q = 100;
  if ($destformat=='.png') $saved=imagepng($dest,$file_dest);
  if ($destformat=='.jpg') $saved=imagejpeg($dest,$file_dest,$q);
  if (!$saved) my_error_log('saving failed');

  imagedestroy($dest);
  imagedestroy($src);
  @chmod($file_dest, 0666);

  return true;
}

答案 1 :(得分:1)

如果

  

(...)然后垂直或水平居中图像(...)

意味着您想要添加白色或黑色边框,我不会这样做。只需保存已调整大小的图像,然后使用html / css在浏览器中进行居中。

答案 2 :(得分:0)

// ---------------------------------------------------------------------------------
//  Resize Image
// ---------------------------------------------------------------------------------
function ResizeImage($FileName,$SaveFile, $MaxWidth, $MaxHeight = null) {

    $extension = GetFileExtension($FileName);

    switch(strtolower($extension)) {
        case "gif":
            $objImage = imagecreatefromgif($FileName);
            break;
        case "png":
            $objImage = imagecreatefrompng($FileName);
            break;
        default:
            $objImage = imagecreatefromjpeg($FileName);
            break;
    }

    list($width, $height, $type, $attr) = getimagesize($FileName);
    $TargetWidth = $width;
    $TargetHeight = $height;
    if (!is_null($MaxWidth)) {
        if ($MaxWidth < $TargetWidth) {
            $TargetWidth = $MaxWidth;
            $TargetHeight = round($TargetHeight * $TargetWidth / $width);
        }
    }
    if (!is_null($MaxHeight)) {
        if ($MaxHeight < $TargetHeight) {
            $TargetHeight = $MaxHeight;
            $TargetWidth = round($TargetWidth * $TargetHeight / $height);
        }
    }


    $DestImage = imagecreatetruecolor($TargetWidth, $TargetHeight);

    // handle transparancy    
    if ( ($type == IMAGETYPE_GIF) || ($type == IMAGETYPE_PNG) ) {
        $trnprt_indx = imagecolortransparent($objImage);
        // If we have a specific transparent color
        if ($trnprt_indx >= 0) {
            // Get the original image's transparent color's RGB values
            $trnprt_color  = imagecolorsforindex($objImage, $trnprt_indx);
            // Allocate the same color in the new image resource
            $trnprt_indx    = imagecolorallocate($DestImage, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);

            // Completely fill the background of the new image with allocated color.
            imagefill($DestImage, 0, 0, $trnprt_indx);

            // Set the background color for new image to transparent
            imagecolortransparent($DestImage, $trnprt_indx);
        } elseif ($type == IMAGETYPE_PNG) {

            // Turn off transparency blending (temporarily)
            imagealphablending($DestImage, false);

            // Create a new transparent color for image
            $color = imagecolorallocatealpha($DestImage, 0, 0, 0, 127);

            // Completely fill the background of the new image with allocated color.
            imagefill($DestImage, 0, 0, $color);

            // Restore transparency blending
            imagesavealpha($DestImage, true);
        }
    }



    imagecopyresampled($DestImage, $objImage, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $width, $height); 
    switch(strtolower($extension)) {
        case "gif":
            imagegif($DestImage, $SaveFile);
            break;
        case "png":
            imagepng($DestImage, $SaveFile,0);
            break;
        default:
            imagejpeg($DestImage,$SaveFile,100);
            break;
    }

}
// ---------------------------------------------------------------------------------
//  GetFileExtension
// ---------------------------------------------------------------------------------
function GetFileExtension($inFileName) {
    return substr($inFileName, strrpos($inFileName, '.') + 1);
}

答案 3 :(得分:0)

首先使用getimagesize();

读入要调整大小的图像的图像大小

确定您希望调整大小的图像的最大宽度和高度。

找出要调整大小的图像的最大宽度或高度。

了解您需要多少距离才能使其在调整大小的宽度或高度范围内。取该值,然后将图像的另一侧分开以进行调整大小。

现在,您可以获得调整后的图像的最终宽度和高度。只需使用imagecopyresampled()。

答案 4 :(得分:0)

我曾经使用过一个名为Image_Transform(http://pear.php.net/package/Image_Transform)的PEAR包。它具有许多用于处理图像的强大功能,并且它非常易于使用(不必是高级PHP程序员)

答案 5 :(得分:0)

以供以后搜索
这是正确的答案
我发现此答案的依据是:http://php.net/manual/en/function.imagecopyresampled.php#112742

function resizeKeepRatio($path,$new_path,$width, $height){
    $image_info = getimagesize($path);
    $image_type = $image_info[2];
    if ($image_type == IMAGETYPE_JPEG) {
        $image = imagecreatefromjpeg($path);
    } elseif ($image_type == IMAGETYPE_GIF) {
        $image = imagecreatefromgif($path);
    } elseif ($timage_type == IMAGETYPE_PNG) {
        $image = imagecreatefrompng($path);
    }else{
        return false; // The image type does not support
    }

    $new_image = imagecreatetruecolor($width, $height);

    $src_w = imagesx($image);
    $src_h = imagesy($image);

    if($src_w > $src_h){
        $dst_w = $width;
        $dst_h = ($dst_w * $src_h) / $src_w ;

        if($dst_h > $height){
            $dst_h = $height;
            $dst_w = ($dst_h * $src_w) / $src_h;
        }
    }else{
        $dst_h = $height;
        $dst_w = ($dst_h * $src_w) / $src_h;

        if($dst_w > $width){
            $dst_w = $width;
            $dst_h = ($dst_w * $src_h) / $src_w;
        }
    }

    $dst_x = abs($width - $dst_w) / 2;
    $dst_y = abs($height - $dst_h) / 2;

    $color = imagecolorallocatealpha($new_image, 0, 0, 0, 127); //fill transparent background
    if ($image_type != IMAGETYPE_PNG) {
        $color = imagecolorallocatealpha($new_image, 255, 255, 255, 0); //fill white background
    }
    imagefill($new_image, 0, 0, $color);
    imagesavealpha($new_image, true);
    imagecopyresampled($new_image, $image, $dst_x, $dst_y,0,0, $dst_w, $dst_h, $src_w, $src_h);

    if ($image_type == IMAGETYPE_JPEG) {
        imagejpeg(new_image, $new_path);
    } elseif ($image_type == IMAGETYPE_GIF) {
        imagegif(new_image, $new_path);
    } elseif ($image_type == IMAGETYPE_PNG) {
        imagepng(new_image, $new_path);
    }

    return true;
}