【问题标题】:PHP Image cropping to squarePHP图像裁剪为正方形
【发布时间】:2012-04-23 20:07:48
【问题描述】:

我正在使用以下 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/

这种情况只发生在纵向图片上,横向图片会被裁剪成填满整个正方形。

【问题讨论】:

  • 正如我在帖子中提到的:它完美地裁剪横向图像,但由于它面向纵向图像,输出缩略图不会被裁剪,但它会按比例缩小以适合给定的方形缩略图高度和两侧的空白空间将被黑色填充。
  • 您可以在此处查看纵向图像裁剪和调整大小的最终结果imageshack.us/photo/my-images/717/imgfl.png

标签: php image resize thumbnails crop


【解决方案1】:

你应该在 if() 语句中添加一个图像配给,这样它就会知道它是纵向还是横向。

更改下面的行

// Calculate measurements
if( $image[0] > $image[1] ) {

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是脚本必须保持功能,以将裁剪的方形图像缩小为缩略图,其大小在函数调用中给出。
    • 我想通了。在脚本检测图像是横向还是纵向的部分中,if 语句写错了,它是 if( $image[0] & $image[1] ) { 检测宽度和大小是否已设置,因此它从未通过描述图像为纵向时的裁剪的 else 语句。我所要做的就是将 if 语句更改为 if( $image[0] > $image[1] ) {。这如何如果宽度大于高度它是横向图像并在 if 语句之后执行脚本,在另一种情况下如果宽度小于高度它是纵向并且在 else 语句之后执行脚本.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2013-03-08
    相关资源
    最近更新 更多