Модификация изображения в php

154
16 декабря 2017, 07:52

Здравствуйте как можно получить вот такой результат с помощью php при загрузки изображение на сервер. Чтобы загружаемые изображения сохранились с одинаковыми размерами (thumb) при этом не сжимались

Answer 1

Используйте библиотеку Imagick, метод Imagick::cropImage. Он делает как раз то, что вам нужно.

Answer 2

Делается на обычном php (да, да, это говнокод, функциональщина, но может хватит уже либы везде и всюду пихать? давайте сначала основы учить):

function resize($image, $out, $w_o = false, $h_o = false) {
    // Размеры выходного изображения
    $outWidth = 120;
    $outHeight = 120;
    if (($w_o < 0) || ($h_o < 0)) {
        echo "Некорректные входные параметры";
        return false;
    }
    list($w_i, $h_i, $type) = getimagesize($image); // Получаем размеры и тип изображения (число)
    $types = array("", "gif", "jpeg", "png"); // Массив с типами изображений
    $ext = $types[$type]; // Зная "числовой" тип изображения, узнаём название типа
    if ($ext) {
        $func = 'imagecreatefrom'.$ext; // Получаем название функции, соответствующую типу, для создания изображения
        $img_i = $func($image); // Создаём дескриптор для работы с исходным изображением
    } else {
        echo 'Некорректное изображение'; // Выводим ошибку, если формат изображения недопустимый
        return false;
    }
    /* Если указать только 1 параметр, то второй подстроится пропорционально */
    if (!$h_o) $h_o = $w_o / ($w_i / $h_i);
    if (!$w_o) $w_o = $h_o / ($h_i / $w_i);
    /* Задаем смещение, центрируя изображение */
    $marge_right = abs($outWidth - $w_o)/2;
    $marge_bottom = abs($outHeight - $h_o)/2;
    $img_o = imagecreatetruecolor($outWidth,$outHeight); // Создаём дескриптор для выходного изображения
    imagefill($img_o,0,0,imagecolorallocate($img_o, 255, 255, 255));
    imagecopyresampled($img_o, $img_i, $marge_right, $marge_bottom, 0, 0, $w_o, $h_o, $w_i, $h_i); // Переносим изображение из исходного в выходное, масштабируя его
    return imagejpeg($img_o,$out,100); // Сохраняем изображение в тот же файл, что и исходное, возвращая результат этой операции
}
$rootPath=$_SERVER["DOCUMENT_ROOT"];
// Код ниже лучше использовать в цикле
$path=$rootPath."/in/".$inImage; // Изображение донор
$realImage=$rootPath."/out/".$outImage; //Выходное изображение
if(!is_file($realImage)){
    if(is_file($path)){
        list($width,$height)=getimagesize($path);
        if($height>$width){
            resize($path,$realImage,false,110);
        }else{
            resize($path,$realImage,110);
        }
    }
}

Магические число 120 выносим за функцию, естественно, и передаем в качестве аргумента. Магическое число 110 - это высота изображения, которое будет вставлено по центру 120-пиксельной конечной картинки.

P.S. Признаюсь честно, пробовал только на квадратных миниатюрах, т.е. 120х120, а внутри уже вертикальные картинки по 110, либо по ширине, либо по высоте.

P.S.S. Поставили минус - отпишитесь за что.

Answer 3
private function minimilize($savefile){
    $image=new Gmagick($savefile);
    $width=$image->getimagewidth();
    $height=$image->getimageheight();
    $standartWidth='';
    $standartHeight='';
    $x='';
    $y='';
    if($width>$height) {
        $standartWidth=1024;
        $standartHeight=756;
        $masWidth=1300;
        $masHeight=900;

        $kw=$width/$masWidth;
        $wx=$width/$kw;
        $image->setCompressionQuality(80);
        $image->profileimage('*',null);
        $image->resizeimage($wx, $wx, null, 1, true);

        $x = (($masWidth - $standartWidth) / 2);
        $y = 0;
    }
    if($width<$height) {
        $standartWidth=1024;
        $standartHeight=756;
        $koef=$width/1024;
        $wx=$height/$koef;
        $image->setCompressionQuality(80);
        $image->profileimage('*',null);
        $image->resizeimage($wx, $wx, null, 1, true);
        $x = 0;
        $y = $wx/7.75;
    }
    $image->cropimage($standartWidth, $standartHeight, $x,$y);
    $image->writeimage($savefile);
    $image->destroy();
}

вот другое решение

еще раз

как установить GM

READ ALSO
PHP многопоточность , curl

PHP многопоточность , curl

У меня есть api , который принимает POST запрос, в теле цифры, и если цифры совпадают, возвращает сгенерированный urlСейчас мне надо написать php скрипт,...

132
Расписание работы зала

Расписание работы зала

Есть необходимость сделать на сайте вывод информации о работе залаВ разное время проводятся разные занятия для разных групп

147
Как прикрепить документ как граффити VK?

Как прикрепить документ как граффити VK?

Интересует такой вопрос, как прикрепить документ как граффити без всяких программ, но возможно с API на PHP или другим способом?

187
Как сохранять файлы между приложениями?

Как сохранять файлы между приложениями?

Есть Yii2 advanced приложениеМне надо сохранить файл из бэкэнда на фронт так что бы он был доступен из обоих приложений

158