php调整图像大小然后裁剪图像问题

Posted

技术标签:

【中文标题】php调整图像大小然后裁剪图像问题【英文标题】:php resize image then crop image problem 【发布时间】:2011-05-09 19:53:40 【问题描述】:

我想将图片大小从 600px * 500px 减小到 60px * 50px 大小,然后将其裁剪为 50px *50px。我有两组代码,一组是缩小图像的大小,另一组是裁剪图像。问题是它们是分开工作的,如何将这两组代码组合起来使它们一起工作?以下是我的代码:

<?php

//codes of group A - Reduce the size of image from 600px * 500px to 60px * 50px   
    $save2 = "images/users/" . $image_name_2; //This is the new file you saving
    list($width2, $height2) = getimagesize($file) ; 
    $modwidth2 = 50; 
    $diff2 = $width2 / $modwidth2;
    $modheight2 = $height2 / $diff2; 
    $tn2 = imagecreatetruecolor($modwidth2, $modheight2) ; 
    $image2 = imagecreatefromjpeg($file) ; 
    imagecopyresampled($tn2, $image2, 0, 0, 0, 0, $modwidth2, $modheight2, $width2, $height2) ; 
    imagejpeg($tn2, $save2, 100) ; 



//codes of group B - Crop the image from 60px * 50px to 50px * 50px 
    $save3 = "images/users/" . $image_name_3;  
    list($width3, $height3) = getimagesize($file) ; 
    $modwidth3 = 60;  
    $diff3 = $width3 / $modwidth3;
    $modheight3 = $height3 / $diff3; 

    $left = 0; 
    $top = 0;

    $cropwidth = 50; //thumb size
    $cropheight = 50;

    $tn3 = imagecreatetruecolor($cropwidth, $cropheight) ; 
    $image3 = imagecreatefromjpeg($file) ; 
    imagecopyresampled($tn3, $image3, 0, 0, $left, $top, $cropwidth, $cropheight, $modwidth3, $modheight3) ; 
    imagejpeg($tn3, $save3, 100) ; //save the cropped image
?>

从上面的两组代码中可以看出,第一组调整图片大小,然后将其保存到文件夹中。第二组代码裁剪图片,然后将其保存到文件夹中。我的问题是......在第一组代码调整图片大小后,是否有必要将其保存到文件夹中才能裁剪它?如果有必要,那么我需要编写新的代码行以从文件夹中检索调整大小的图片,以便第二组代码进行裁剪?如果没有必要,在调整图片大小后,如何将图片传递给第二组代码进行裁剪?

【问题讨论】:

你在哪里调整图片大小?你能提一下这条线吗? 嗨,我已经通过添加调整图片代码来更新我的问题。请看一看。谢谢。 让我澄清一下:你有分辨率的图片,例如900x600,并且您想调整图像的大小,使较小的边为 50(在本例中将图像大小调整为 75x50),然后将其裁剪为 50x50。不是吗? @Arman P,是的,你是对的。 使用此类:github.com/qaribhaider/php-image-resize,1- 将图像大小调整为精确的宽度高度 2- 使用裁剪方法调整大小 【参考方案1】:

你是@zac1987。 完整的 PHP 代码生成所需大小的方形缩略图而不拉伸图像。该代码支持 png 和 jpg/jpeg 图像扩展。只需将设置部分更改为所需的部分。您可以复制粘贴代码并在您的网络服务器上进行测试。

<?php

    // SETTINGS
    $image_name = 'file.jpg';    // Full path and image name with extension
    $thumb_name = 'thumbnail';   // Generated thumbnail name without extension
    $thumb_side = 100;           // Desired thumbnail side size
    // END OF SETTINGS

    $image_extension = explode('.', $image_name); // I assume that images are named only following 'imagename.ext' pattern

    if (preg_match('/jpg|jpeg/', $image_extension[1])) 
        $src_image = imagecreatefromjpeg($image_name);
        $image_extension = 'jpg';
     else if (preg_match('/png/', $image_extension[1])) 
        $src_image = imagecreatefrompng($image_name);
        $image_extension = 'png';
    

    $src_width = imageSX($src_image);   // Width of the original image
    $src_height = imageSY($src_image);  // Height of the original image

    $min_side = min($src_width, $src_height);

    /*********** If you need this part uncomment it
    $ratio = $min_side / $thumb_width;
    $new_width = floor($src_width / $ratio);
    $new_height = floor($src_height / $ratio);
    **********************************************/    

    $dst_image = imagecreatetruecolor($thumb_side, $thumb_side);

    imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $thumb_side, $thumb_side, $min_side, $min_side);

    switch ($image_extension)
    
        case 'jpg':
            imagejpeg($dst_image, $thumb_name . '.jpg', 100);
            break;
        case 'png':
            imagepng($dst_image, $thumb_name . '.jpg', 100);
            break;
    

    imagedestroy($src_image);
    imagedestroy($dst_image);

?>

【讨论】:

@zac1987 不客气,同时从其他坐标裁剪(不是左:0,上:0) - 只需编辑 imagecopyresampled 中的第三和第四个零。 是的,我确实将协调分配给了您的代码。 if($src_width > $src_height) $top=0; $left=70;elseif ($src_width 【参考方案2】:
$modwidth3 = 500;  //I resize the picture width to smaller as 60px.
$diff3 = $width3 / $modwidth3;
$modheight3 = $height3 / $diff3;  //I resize the picture height to smaller.

$left = 1; //getting the left and top coordinate
$top = 1;

$cropwidth = 50; //thumb size
$cropheight = 50;

imagecopyresampled($tn3, $image3, 0, 0, $left, $top, $cropwidth, $cropheight, $modwidth3, $modheight3) ; 

$modwidth3$modheight3需要对应你要裁剪的图片的宽高。 $top$left 也应该与您要裁剪的区域的左上角坐标相匹配。如果原始图像为 600x500 像素,并且您想调整大小并裁剪为 50x50,则应将 $top 设置为 0,将 $left 设置为 50 (px)。 $modwidth 和 $modheight 都应该设置为 500。这样可以保持原始图像的完整高度,并从左侧切掉 50px,从右侧切掉 50px。剩余的 500px 被裁剪为 50px。

【讨论】:

原图尺寸不是固定的,可能是800px * 1200px,所以你说的两边都剪50px的概念是行不通的。此外,如果我按照您所说的“$modwidth 和 $modheight 应该设置为 500”,那么图像看起来会被拉伸,因为原始图像是 500px * 600px。 没错,代码不完整,您可能会在计算中发现错误。我没有测试代码。然而,代码下方的文本应该会为您提供有关如何解决问题的大量信息。【参考方案3】:

链接到我写的关于如何将任意大小的图像调整为任意大小的博客文章。包括用于信箱和裁剪以适应的选项。

http://www.spotlesswebdesign.com/blog.php?id=1

【讨论】:

以上是关于php调整图像大小然后裁剪图像问题的主要内容,如果未能解决你的问题,请参考以下文章

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

将裁剪添加到 PHP 图像调整大小脚本

在php中将图像调整大小并裁剪为固定大小

Dart/Flutter 替代 PHP 调整裁剪图像大小?

这个调整图像大小/裁剪图像的逻辑是不是正确(在 php 中,但它是关于逻辑而不是代码)

使用 PHP 图像调整大小/裁剪内置方法的高内存使用率