php – 使用imagecopyresampled裁剪图像的中心平方

我正在尝试从正常尺寸的图像创建2个裁剪缩略图(60×60和150×150).一切都很好,除了裁剪,这是行不通的.那部分是生成一个右下方有黑线的缩略图,如下所示:

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

调整大小工作得很好,因为最终缩略图的正确高度为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');
上一篇:javascript – 初始化cropper.js时出错


下一篇:【Excle数据透视】如何创建一个数据透视表