在PHP中裁剪图像的一部分并调整大小

时间:2010-10-27 06:13:08

标签: php gd thumbnails image-manipulation crop

我有一个源图像(可以是任何具有不同尺寸的图像)。我希望能够从图像中告诉php一个区域来裁剪和调整大小。例如:

  • 源图像为800x800像素。
  • PHP选择图像的50x50像素区域,选择区域距离源图像的上边缘80像素,距离源图像左边缘100像素
  • 然后将所选区域的大小调整为37x37像素。

我尝试使用函数imagecopyresampled()和imagecopyresized(),但它们都给了我一个奇怪的问题:imagecopyresampled()输出选择图像但被一个等同于源图像尺寸的黑色区域包围。 imagecopyresized()也会选择所选区域,但它只是覆盖在源图像上。这里的最终目标是从源图像制作缩略图。

我已经使用的代码示例是:

list($width_orig, $height_orig) = getimagesize($filename);
imagecopyresized($image_final, $image, 0, 0, 0, 0, 37, 37, $width_orig, $height_orig);

上述内容与该任务描述的完全不同,但它演示了我遇到的问题。

注意:

据我所知,对这个主题进行搜索会产生很多结果,但它们主要引用的库和类比我实际需要的要多得多。我宁愿了解解决方案并实现更有效的方法。因此,我不希望被指向完成上述任务和其他50项任务的详尽脚本。我宁愿理解以上内容,这样我就可以创建一个最佳的自定义解决方案。

2 个答案:

答案 0 :(得分:2)

你的问题实际上是一个逻辑问题。你能检查一下吗? 如果它不适合作物长度的缩放比例。

    $w  = imagesx($img);
    $h  = imagesy($img);
    $newImage = imagecreatetruecolor($wNewOrj, $hNewOrj);
    if(($w/$h)<($wNewOrj/$hNewOrj)){
      $hNew = $h * $wNewOrj/$w;
      $wNew = $wNewOrj;
    }else{
      $hNew = $hNewOrj;
      $wNew = $w * $hNewOrj/$h;
    }
    $wDiff  = round(abs($wNewOrj-$wNew)/2);
    $hDiff  = round(abs($hNewOrj-$hNew)/2);
    imagecopyresampled($newImage, $img,
                       0,     0,     $wDiff,    $hDiff,
                       $wNew, $hNew, $w-$wDiff, $h-$hDiff);

    imagejpeg($newImage, $path, 85);

答案 1 :(得分:0)

尝试我的图像操纵器类,它完全符合您的要求 - http://github.com/philBrown/Tolerable/blob/master/library/Tolerable/Image/Manipulator.php