Сформировать изображения JPG на PHP

336
08 ноября 2017, 03:21

Дано: файлы форматов jpg (jpeg) и png разных размеров (небольшие, порядка 300Кб максимум).

Требуется: сформировать изображения, соблюдая пропорции, размером 110х110, и поместить на белый фон размером 120х120 (чтобы хоть какой-то минимальный отступ был).

Попытки реализации:

  1. Без проверки на тип данных:

    public static function imageResize($out,$in,$weight,$height,$quality) {
        $im=imagecreatefromjpeg($in);
        $im1=imagecreatetruecolor($weight,$height);
        imagecopyresampled($im1,$im,0,0,0,0,$weight,$height,imagesx($im),imagesy($im));
        imagejpeg($im1,$out,$quality);
        imagedestroy($im);
        imagedestroy($im1);
    }
    ...
    $path=$rootPath."/1c/img/".$product->image;
    $realImage=$rootPath."/products/".$product->image;
    ...
    helper::imageresize($realImage,$path,120,120,100);
    

Проблемы: ругается на png (я ж не проверяю формат), выходные изображения непропорциональны, изображения из png создаются просто черными.

  1. С проверкой, но без пропорций:

    public static function getImage($path){
        $mime = mime_content_type($path);
        switch($mime) {
            case 'image/png':
                $img = imagecreatefrompng($path);
                break;
            case 'image/gif':
                $img = imagecreatefromgif($path);
                break;
            case 'image/jpeg':
                $img = imagecreatefromjpeg($path);
                break;
            default:
                $img = null;
        }
        return $img;
    }
    ...
    $realImage=$rootPath."/products/".$product->image;
    ...
    $gdImage=helper::getImage($path);
    $im = imagecreatetruecolor(120, 120);
    imagejpeg($gdImage, $realImage);
    imagedestroy($gdImage);
    

Проблемы: изображения просто копируются одно в другое (с исходными размерами), изображения из png скопировались, но встали на черном фоне.

То есть, в первом случае, я работаю с реальными изображениями, а во втором с объектами, и как объединить оба способа я не знаю. К тому же требуется еще создать пустое белое изображение и поместить на него пропорциональное подготовленное изображение. Также очень важно, чтобы конечные jpg файлы были именно jpg, чтобы потом, при последующем копировании, я не делал проверки на тип данных (мне потом это все через PHPExcel размещать в файле нужно будет (но там уже все готово)).

P.S. За многоточиями опущено получение записей из БД и цикл, в котором выполняется этот код.

P.P.S. @teran, огромное спасибо! Вот что получилось, благодаря Вашим наводкам, может кому и пригодится (комментарии просто для пояснения):

public static function imageResize($out,$in,$width,$height,$quality) {
    //создаем новое изображение из входного с проверкой типа файла
    $im=self::getImage($in);
    //создаем новое пустое изображение, заданных размеров
    $im1=imagecreatetruecolor($width,$height);
    //заполняем только что созданное изображение
    //белым цветом (по умолчанию создается с черным фоном)
    imagefill($im1,0,0,imagecolorallocate($im1, 255, 255, 255));
    //копируем входное изображение в только что созданное и покрашенное с
    //сохранением пропорций (сильно не пинайте, как понял, так и написал)
    imagecopyresampled($im1,$im,0,0,0,0,$width,$height,imagesx($im),imagesy($im));
    //создаем новое JPG изображение и удаляем экземпляры,
    //с которыми работали в памяти
    imagejpeg($im1,$out,$quality);
    imagedestroy($im);
    imagedestroy($im1);
}

P.P.P.S. Сделал как сумел, может есть более правильные решения данной задачи? Единственное с чем несправился так это с добавлением бордюров по краям изображения, то есть ужать исходник до 110х110 и поместить на холст в 120х120, правда изображения итак мелкие, но может пригодится в будущем.

READ ALSO
PHP форма заказа

PHP форма заказа

Есть скрипт PHP (форма заявки на сайте), когда нажимаю отправить?, страница с главной переходит на http//сайт123/form1php в пустое окно

283
Расчёт времени до конца дня и года

Расчёт времени до конца дня и года

Я сделал расчёт, у меня в браузере всё правильно работает, как и задуманоЯ заметил, что со временем иногда, есть какие-то отклонение на +- несколько...

297
оценка для новости

оценка для новости

на странице есть звездный рейтинг:

247
Функция для кук

Функция для кук

Сделал функцию, которая добавляет и удаляет куки, проблема в том, что, если её запустить несколько раз подряд, то будет ошибка Невозможно переопределить...

232