使用 php 裁剪图像

Posted

技术标签:

【中文标题】使用 php 裁剪图像【英文标题】:Cropping an image using php 【发布时间】:2014-10-21 13:47:35 【问题描述】:

我正在尝试在上传图片后对其进行裁剪。到目前为止,我只设法调整了它的大小,但是如果图像是矩形,那么图像会被压扁,看起来不太好。我正在尝试获取可以与当前必须调整大小的函数一起使用的编码。我看到的那些我必须改变我的功能,我希望不要这样做。

这是我的功能

function createThumbnail($filename) 
     global $_SITE_FOLDER;
    //require 'config.php';
    $final_width_of_image = 82;
    $height = 85;
    $path_to_image_directory = $_SITE_FOLDER.'portfolio_images/';
    $path_to_thumbs_directory = $_SITE_FOLDER.'portfolio_images/thumbs/';

    if(preg_match('/[.](jpg)$/', $filename)) 
        $im = imagecreatefromjpeg($path_to_image_directory . $filename);
     else if (preg_match('/[.](gif)$/', $filename)) 
        $im = imagecreatefromgif($path_to_image_directory . $filename);
     else if (preg_match('/[.](png)$/', $filename)) 
        $im = imagecreatefrompng($path_to_image_directory . $filename);
    

    $ox = imagesx($im);
    $oy = imagesy($im);

    $nx = $final_width_of_image;
    $ny = floor($oy * ($final_width_of_image / $ox));
    //$ny = $height;

    $nm = imagecreatetruecolor($nx, $ny);

    imagecopyresized($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy);



    if(!file_exists($path_to_thumbs_directory)) 
      if(!mkdir($path_to_thumbs_directory)) 
           die("There was a problem. Please try again!");
       
       

    imagejpeg($nm, $path_to_thumbs_directory . $filename);
    $tn = '<img src="' . $path_to_thumbs_directory . $filename . '"  />';
    $tn .= '<br />Congratulations. Your file has been successfully uploaded, and a      thumbnail has been created.';
    echo $tn;

【问题讨论】:

最近我开始认为使用已经存在的库来完成特定的工作可以节省我的时间。你知道imagemagick吗?您的网络主机可能必须将其安装在您的服务器上,以便您可以使用它,但请看一下php.net/manual/en/book.imagick.php 【参考方案1】:

这是我的功能。

 <?php
    function crop($file_input, $file_output, $crop = 'square',$percent = false) 
        list($w_i, $h_i, $type) = getimagesize($file_input);
        if (!$w_i || !$h_i) 
            echo 'Unable to get the length and width of the image';
            return;
            
            $types = array('','gif','jpeg','png');
            $ext = $types[$type];
            if ($ext) 
                    $func = 'imagecreatefrom'.$ext;
                    $img = $func($file_input);
             else 
                    echo 'Incorrect file format';
            return;
            
        if ($crop == 'square') 
            $min = $w_i;
            if ($w_i > $h_i) $min = $h_i;
            $w_o = $h_o = $min;
         else 
            list($x_o, $y_o, $w_o, $h_o) = $crop;
            if ($percent) 
                $w_o *= $w_i / 100;
                $h_o *= $h_i / 100;
                $x_o *= $w_i / 100;
                $y_o *= $h_i / 100;
            
                    if ($w_o < 0) $w_o += $w_i;
                $w_o -= $x_o;
            if ($h_o < 0) $h_o += $h_i;
            $h_o -= $y_o;
        
        $img_o = imagecreatetruecolor($w_o, $h_o);
        imagecopy($img_o, $img, 0, 0, $x_o, $y_o, $w_o, $h_o);
        if ($type == 2) 
            return imagejpeg($img_o,$file_output,100);
         else 
            $func = 'image'.$ext;
            return $func($img_o,$file_output);
        
    
    ?>

你可以这样调用

crop($file_input, $file_output, $crop = 'square',$percent = false);

如果需要,还可以调整函数大小。

<?php
function resize($file_input, $file_output, $w_o, $h_o, $percent = false) 
    list($w_i, $h_i, $type) = getimagesize($file_input);
    if (!$w_i || !$h_i) 
        return;
        
        $types = array('','gif','jpeg','png');
        $ext = $types[$type];
        if ($ext) 
                $func = 'imagecreatefrom'.$ext;
                $img = $func($file_input);
         else 
        return;
        
    if ($percent) 
        $w_o *= $w_i / 100;
        $h_o *= $h_i / 100;
    
    if (!$h_o) $h_o = $w_o/($w_i/$h_i);
    if (!$w_o) $w_o = $h_o/($h_i/$w_i);

    $img_o = imagecreatetruecolor($w_o, $h_o);
    imagecopyresampled($img_o, $img, 0, 0, 0, 0, $w_o, $h_o, $w_i, $h_i);
    if ($type == 2) 
        return imagejpeg($img_o,$file_output,100);
     else 
        $func = 'image'.$ext;
        return $func($img_o,$file_output);
    

?>

resize($file_input, $file_output, $w_o, $h_o, $percent = false);

【讨论】:

【参考方案2】:

您可以使用 SimpleImage 此处找到的 SimpleImage 类

[编辑] 这里有更多功能的更新版本SimleImage Updated

我在将各种图像调整为较小的缩略图大小时使用它,同时保持纵横比和精确的图像大小输出。我用适合放置图像的背景的颜色填充空白区域,该类支持裁剪。探索 cutFromCenter 和 maxareafill 方法。

例如,在您的代码中,您不需要 imagecreatefromjpeg() 您只需;

包括include('SimpleImage.php');

那么;

$im = new SimpleImage();
$im->load($path_to_image_directory . $filename);
$im->maxareafill($output_width,$output_height, 0,0,0); // rgb
$im->save($path_to_image_directory . $filename);

我每天都在使用这个类,发现它用途广泛。

【讨论】:

以上是关于使用 php 裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 或 Javascript 裁剪图像 [关闭]

使用 jWindowCrop 裁剪图像 - PHP

使用 php 裁剪图像

在 PHP imagecopyresampled 中裁剪图像 - 挤压而不是裁剪

使用 PHP 裁剪图像

PHP图像调整大小和裁剪功能