PHP图像裁剪到正方形

时间:2012-04-11 13:50:06

标签: php image resize thumbnails crop

我使用以下PHP脚本创建方形缩略图,我在这里http://www.abeautifulsite.net/blog/2009/08/cropping-an-image-to-make-square-thumbnails-in-php/

我能够将其整合到我的图片上传脚本中,该脚本上传完整尺寸的图片,之后获取上传的图片并从中创建缩略图。 问题是剧本的作者说,它将裁剪风景和肖像图像没有问题。它可以完美地渲染风景图像,但是当它面向肖像图像时,输出缩略图将不会被裁剪,但它会缩小以适合给定的方形缩略图高度,并且两侧的空间将填充黑色。 我知道有办法解决这个问题,但由于我对PHP比较陌生,我无法解决它。

有些真正有PHP经验的人可以解决这个问题吗? 提前谢谢!

脚本在这里:     $

 function square_crop($src_image, $dest_image, $thumb_size = 64, $jpg_quality = 90) {

// Get dimensions of existing image
$image = getimagesize($src_image);

// Check for valid dimensions
if( $image[0] <= 0 || $image[1] <= 0 ) return false;

// Determine format from MIME-Type
$image['format'] = strtolower(preg_replace('/^.*?\//', '', $image['mime']));

// Import image
switch( $image['format'] ) {
    case 'jpg':
    case 'jpeg':
        $image_data = imagecreatefromjpeg($src_image);
    break;
    case 'png':
        $image_data = imagecreatefrompng($src_image);
    break;
    case 'gif':
        $image_data = imagecreatefromgif($src_image);
    break;
    default:
        // Unsupported format
        return false;
    break;
}

// Verify import
if( $image_data == false ) return false;

// Calculate measurements
if( $image[0] & $image[1] ) {
    // For landscape images
    $x_offset = ($image[0] - $image[1]) / 2;
    $y_offset = 0;
    $square_size = $image[0] - ($x_offset * 2);
} else {
    // For portrait and square images
    $x_offset = 0;
    $y_offset = ($image[1] - $image[0]) / 2;
    $square_size = $image[1] - ($y_offset * 2);
}

// Resize and crop
$canvas = imagecreatetruecolor($thumb_size, $thumb_size);
if( imagecopyresampled(
    $canvas,
    $image_data,
    0,
    0,
    $x_offset,
    $y_offset,
    $thumb_size,
    $thumb_size,
    $square_size,
    $square_size
)) {

    // Create thumbnail
    switch( strtolower(preg_replace('/^.*\./', '', $dest_image)) ) {
        case 'jpg':
        case 'jpeg':
            return imagejpeg($canvas, $dest_image, $jpg_quality);
        break;
        case 'png':
            return imagepng($canvas, $dest_image);
        break;
        case 'gif':
            return imagegif($canvas, $dest_image);
        break;
        default:
            // Unsupported format
            return false;
        break;
    }

     } else {
    return false;
     }
    }
    ?>

我称之为square_crop('source_image','destination_image',65);

您可以在此处查看结果http://imageshack.us/photo/my-images/717/imgfl.png/

仅在肖像图像中出现,景观图像以填充整个正方形的方式裁剪。

2 个答案:

答案 0 :(得分:1)

仅对于裁剪,请将imagecopyresampled()函数替换为imagecopy()。

如果源和目标坐标以及宽度和高度不同,则重采样会执行适当的图像拉伸或缩小。 imagecopy()没有。

答案 1 :(得分:0)

你应该在if()语句中添加一个图像比例,这样就可以理解它是肖像还是风景。

更改

下面的一行
// Calculate measurements
if( $image[0] > $image[1] ) {