如果已知尺寸,则裁剪图像

时间:2013-05-23 05:21:54

标签: php crop

我有一个图像和裁剪图像所需的所有尺寸。我想从源路径中选择图像并将图像保存到目标路径。我想知道我应该使用哪些函数来裁剪图像和保存它。

2 个答案:

答案 0 :(得分:3)

The follwing code will do the work

/**
 * Php function to crop an image
 * 
 * @param string $source_image Path of the source image
 * @param string $target_image Path of the target image
 * @param array $crop_area Array like array('left' => [LEFT], 'top' => [TOP],
 *                                          'width' => [WIDTH], => 'height' => [HEIGHT]) 
 */
function cropImage($source_image, $target_image, $crop_area)
{
    // detect source image type from extension
    $source_file_name = basename($source_image);
    $source_image_type = substr($source_file_name, -3, 3);

    // create an image resource from the source image  
    switch(strtolower($source_image_type))
    {
        case 'jpg':
            $original_image = imagecreatefromjpeg($source_image);
            break;

        case 'gif':
            $original_image = imagecreatefromgif($source_image);
            break;

        case 'png':
            $original_image = imagecreatefrompng($source_image);
            break;    

        default:
            trigger_error('cropImage(): Invalid source image type', E_USER_ERROR);
            return false;
    }

    // create a blank image having the same width and height as the crop area
    // this will be our cropped image
    $cropped_image = imagecreatetruecolor($crop_area['width'], $crop_area['height']);

    // copy the crop area from the source image to the blank image created above
    imagecopy($cropped_image, $original_image, 0, 0, $crop_area['left'], $crop_area['top'], 
              $crop_area['width'], $crop_area['height']);

    // detect target image type from extension
    $target_file_name = basename($target_image);
    $target_image_type = substr($target_file_name, -3, 3);

    // save the cropped image to disk
    switch(strtolower($target_image_type))
    {
        case 'jpg':
            imagejpeg($cropped_image, $target_image, 100);
            break;

        case 'gif':
            imagegif($cropped_image, $target_image);
            break;

        case 'png':
            imagepng($cropped_image, $target_image, 0);
            break;    

        default:
            trigger_error('cropImage(): Invalid target image type', E_USER_ERROR);
            imagedestroy($cropped_image);
            imagedestroy($original_image);
            return false;
    }

    // free resources
    imagedestroy($cropped_image);
    imagedestroy($original_image);

    return true;
}


// using the function to crop an image
$source_image = 'image.jpg';
$target_image = 'cropped_image.jpg';
$crop_area = array('top' => 100, 'left' => 100, 'height' => 300, 'width' => 300);

cropImage($source_image, $target_image, $crop_area);

See this

答案 1 :(得分:1)

尝试此功能,它会在您指定的尺寸中生成新图像,并在必要时保持纵横比和裁剪图像。

function resize_image_crop($image, $width, $height)
 {

    $w = @imagesx($image); //current width

    $h = @imagesy($image); //current height
    if ((!$w) || (!$h)) { $GLOBALS['errors'][] = 'Image couldn\'t be resized because it wasn\'t a valid image.'; return false; }
    if (($w == $width) && ($h == $height)) { return $image; }  //no resizing needed
    $ratio = $width / $w;       //try max width first...
    $new_w = $width;
    $new_h = $h * $ratio;    
    if ($new_h < $height) {  //if that created an image smaller than what we wanted, try the other way
        $ratio = $height / $h;
        $new_h = $height;
        $new_w = $w * $ratio;
    }
    $image2 = imagecreatetruecolor ($new_w, $new_h);
    imagecopyresampled($image2,$image, 0, 0, 0, 0, $new_w, $new_h, $w, $h);    
    if (($new_h != $height) || ($new_w != $width)) {    //check to see if cropping needs to happen
        $image3 = imagecreatetruecolor ($width, $height);
        if ($new_h > $height) { //crop vertically
            $extra = $new_h - $height;
            $x = 0; //source x
            $y = round($extra / 2); //source y
            imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height);
        } else {
            $extra = $new_w - $width;
            $x = round($extra / 2); //source x
            $y = 0; //source y
            imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height);
        }
        imagedestroy($image2);
        return $image3;
    } else {
        return $image2;
    }
}