php image resize - квадрат / обрезанный эскиз от центра? - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть скрипт загрузки изображения, который изменяет размер загруженного изображения до 150x150 пикселей. Прекрасно, если изображение квадратное, но если кто-то загрузит изображение, скажем, с разрешением 640x200 пикселей, оно выглядит не очень красиво.

Так что мне в основном это нужно, чтобы автоматически создавать квадратные миниатюры, основанные на центре изображения. Если изображение шире, оно должно обрезаться с левой и правой сторон. Если изображение выше, оно должно обрезаться сверху и снизу.

Я нашел модификацию кода онлайн, а точнее:

Загрузка, изменение размера и обрезка центра изображения с помощью PHP

Я не очень хорошо разбираюсь в PHP и занимаюсь этим уже несколько часов, пытаясь объединить мой код ниже с вариантом выше. Если бы кто-нибудь мог мне помочь, это было бы здорово :) 1011

                                $target_path = "avatars/";
        $image     = $_FILES['uploadedfile']['name'];
        $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 
        $_POST["userpic"]=$_FILES['uploadedfile']['name'];
        if($_FILES['uploadedfile']['tmp_name']!="") {
        $imagetype=explode(".",$_POST["userpic"]);

        if($imagetype[1]=="jpg" || $imagetype[1]=="JPG" || $imagetype[1]=="gif" || $imagetype[1]=="GIF")
        {
        $target_path = "avatars/";
        $thaid=$_POST["user_id"];
        $target_path = $target_path .$thaid.".".$imagetype[1]; 
        $target_path2 =$thaid.".".$imagetype[1]; 
        move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path);
        $_POST["userpic"]=$target_path2;
        $n_width=$setts['avatar_width']; 
        $n_height=$setts['avatar_height']; 
        $tsrc=$target_path; 
        $add=$target_path;

        if($imagetype[1]=="jpg" || $imagetype[1]=="JPG")
        {
        $im=imagecreatefromjpeg($add);
        $width=imagesx($im); 
        $height=imagesy($im); 
        $newimage=imagecreatetruecolor($n_width,$n_height);


        $ar = 1.00;

    if ($ar < 1) { // "tall" crop
$cropWidth = min($height * $ar, $width);
$cropHeight = $cropWidth / $ar;
    }
    else { // "wide" crop
$cropHeight = min($width / $ar, $height);
$cropWidth = $cropHeight * $ar;
    }


        imagecopyresized($newimage,$im,0,0,0,0,$n_width,$n_height,$cropWidth,$cropHeight);
        imagejpeg($newimage,$tsrc,100);
        }
        if($imagetype[1]=="gif" || $imagetype[1]=="GIF")
        {
        $im=imagecreatefromgif($add);
        $width=imagesx($im);              
        $height=imagesy($im);            
        $newimage=imagecreatetruecolor($n_width,$n_height);
        imagecopyresized($newimage,$im,0,0,0,0,$n_width,$n_height,$width,$height);
        imagegif($newimage,$tsrc,100);
        }
        }
        else
        {
        $_POST["userpic"]="noimage.jpg";
        }
        } 

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Если у вас установлен ImageMagick, вы можете сделать что-то вроде:

<?php
$i = new Imagick();
$i->readImage($file);
$i->cropThumbnailImage($w,$h);

Таким образом, вам не нужно беспокоиться о математике.

1 голос
/ 23 февраля 2012

Математика для расчета размеров региона для обрезки не сложна.Я дал ответ на этот вопрос , который позволяет вам рассчитать это для любого соотношения сторон области урожая;так как вам нужна квадратная миниатюра, вы должны установить соотношение сторон 1.

Затем, зная размеры вашего исходного изображения и миниатюры, легко вычислить значения, которые нужно передать в imagecopyresized.

...