php - 使用 imagecopyresampled 裁剪图像的中心正方形

标签 php thumbnails crop resize-crop

我正在尝试从正常尺寸的图像创建 2 个裁剪缩略图(60x60 和 150x150)。除了裁剪之外,一切都很好,裁剪不起作用。该部分正在生成一个缩略图,右侧有一条黑线,如下所示:

.............
.         ...
.         ...
.         ...
.............

调整大小效果很好,因为最后的缩略图具有正确的 60 和 150 高度(从原始横向图像开始工作)但它们仍然是横向的。

我有什么:

list($thumb_width, $thumb_height) = getimagesize($thumb_target);
if ($thumb_width > $thumb_height) { // landscape
    $thumb1_new_height = 60;
    $thumb1_new_width = floor( $thumb_width * ( $thumb1_new_height / $thumb_height ));
    $thumb1_crop_x = ceil(($thumb_width - $thumb_height) / 2);
    $thumb1_crop_y = 0;
    $thumb2_new_height = 150;
    $thumb2_new_width = floor( $thumb_width * ( $thumb2_new_height / $thumb_height ));
    $thumb2_crop_x = ceil(($thumb_width - $thumb_height) / 2);
    $thumb2_crop_y = 0;
}
else if ($thumb_width < $thumb_height){ // portrait
    $thumb1_new_width = 60;
    $thumb1_new_height = floor( $thumb_height * ( $thumb1_new_width / $thumb_width ));
    $thumb1_crop_x = 0;
    $thumb1_crop_y = ceil(($thumb_height - $thumb_width) / 2);
    $thumb2_new_width = 150;
    $thumb2_new_height = floor( $thumb_height * ( $thumb2_new_width / $thumb_width ));
    $thumb2_crop_x = 0;
    $thumb2_crop_y = ceil(($thumb_height - $thumb_width) / 2);
} else { // square
    $thumb1_new_width = 60;
    $thumb1_new_height = 60;
    $thumb1_crop_x = 0;
    $thumb1_crop_y = 0;
    $thumb2_new_width = 150;
    $thumb2_new_height = 150;
    $thumb2_crop_x = 0;
    $thumb2_crop_y = 0;
}
$thumb1_tmp_img = imagecreatetruecolor($thumb1_new_width,$thumb1_new_height);
$thumb2_tmp_img = imagecreatetruecolor($thumb2_new_width,$thumb2_new_height);
imagecopyresampled($thumb1_tmp_img, $thumb_img, 0, 0, $thumb1_crop_x, $thumb1_crop_y, $thumb1_new_width, $thumb1_new_height, $thumb_width, $thumb_height);
imagecopyresampled($thumb2_tmp_img, $thumb_img, 0, 0, $thumb2_crop_x, $thumb2_crop_y, $thumb2_new_width, $thumb2_new_height, $thumb_width, $thumb_height);

最佳答案

我认为你的 thumb1_tmp_img 接近尾声时出错了。我把它作为一个类,所以我不必像你那样重复很多,但你可以看到变化。看看这是否适合您:

class ImageFactory
    {
        public  function MakeThumb($thumb_target = '', $width = 60,$height = 60,$SetFileName = false, $quality = 80)
            {
                $thumb_img  =   imagecreatefromjpeg($thumb_target);

                // size from
                list($w, $h) = getimagesize($thumb_target);

                if($w > $h) {
                        $new_height =   $height;
                        $new_width  =   floor($w * ($new_height / $h));
                        $crop_x     =   ceil(($w - $h) / 2);
                        $crop_y     =   0;
                }
                else {
                        $new_width  =   $width;
                        $new_height =   floor( $h * ( $new_width / $w ));
                        $crop_x     =   0;
                        $crop_y     =   ceil(($h - $w) / 2);
                }

                // I think this is where you are mainly going wrong
                $tmp_img = imagecreatetruecolor($width,$height);

                imagecopyresampled($tmp_img, $thumb_img, 0, 0, $crop_x, $crop_y, $new_width, $new_height, $w, $h);

                if($SetFileName == false) {
                        header('Content-Type: image/jpeg');
                        imagejpeg($tmp_img);
                }
                else
                    imagejpeg($tmp_img,$SetFileName,$quality);

                imagedestroy($tmp_img);
            }
    }

// Initiate class
$ImageMaker =   new ImageFactory();

// Here is just a test landscape sized image
$thumb_target   =   'http://media1.santabanta.com/full6/Outdoors/Landscapes/landscapes-246a.jpg';

// 60px x 60px
$ImageMaker->MakeThumb($thumb_target,60,60,'image60px.jpg');

// Here is a portrait for testing
$thumb_target   =   'http://imgc.allpostersimages.com/images/P-488-488-90/55/5543/L6HLG00Z/posters/warning-you-are-entering-a-fart-zone.jpg';

// 150px x 150px
$ImageMaker->MakeThumb($thumb_target,150,150,'image150px.jpg');

关于php - 使用 imagecopyresampled 裁剪图像的中心正方形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27350770/

相关文章:

android - 裁剪后如何保存文件?

php - 捕获异常时使用Guzzle的isSuccessful方法

php - 这有点过分还是我做对了?

Android 缩略图生成在 MINI_KIND 和 MICRO_KIND 之间不同

c# - 为上传的图像创建缩略图

ios - 使用 getThumbnailBatch 获取保管箱缩略图

android - 在 android 上使用 com.android.camera.action.CROP 裁剪保存的图像

python - 用于调整图像大小的独立 Python 脚本

php - 如果它在 php 中为空,如何以较低的顺序对空键和值进行排序

php - 如何使用群()