我有一个图像和裁剪图像所需的所有尺寸。我想从源路径中选择图像并将图像保存到目标路径。我想知道我应该使用哪些函数来裁剪图像和保存它。
答案 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);
答案 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;
}
}