Миниатюра PHP с белым фоном и не централизованная

У меня есть следующий php-скрипт для создания эскиза после загрузки изображения. Он работает правильно, но создает черный фон и не центрирует изображение, если оно не того размера, который вам нужен. Кто-нибудь знает, как оставить белый фон и центрировать его?

Как это исправить https://imgur.com/a/uTrPadZ

if ($_SERVER['REQUEST_METHOD']=='POST')
{
$filetmp = $_FILES["image"]["tmp_name"];
$filename = $_FILES["image"]["name"];
$filetype = $_FILES["image"]["type"];
$filesize = $_FILES["image"]["size"];
$fileinfo = getimagesize($_FILES["image"]["tmp_name"]);
$filewidth = $fileinfo[0];
$fileheight = $fileinfo[1];
$filepath = "../uploads/";
$filepath_thumb = "../thumbnail/";

if ($filetmp == "")
{
    echo "please select a photo";
}
else
{

    if ($filesize > 2097152)
    {
        echo "photo > 2mb";
    }
    else
    {

        if ($filetype != "image/jpeg" && $filetype != "image/png" && $filetype != "image/gif")
        {
            echo "Please upload jpg / png / gif";
        }
        else
        {
            $final_image = rand(1000,1000000).$filename;
            $filepath = $filepath.strtolower($final_image);
            move_uploaded_file($filetmp,$filepath);             

            if ($filetype == "image/jpeg")
            {
              $imagecreate = "imagecreatefromjpeg";
              $imageformat = "imagejpeg";
            }
            if ($filetype == "image/png")
            {                        
              $imagecreate = "imagecreatefrompng";
              $imageformat = "imagepng";
            }
            if ($filetype == "image/gif")
            {                        
              $imagecreate= "imagecreatefromgif";
              $imageformat = "imagegif";
            }

            $new_width = "200";
            $new_height = "200";


            $filepath_thumb = $filepath_thumb.strtolower($final_image);
            $image_p = imagecreatetruecolor($new_width, $new_height);
            $image = $imagecreate($filepath); //photo folder
            if ($filewidth > $fileheight) 
            {
                $thumb_w    =   $new_width;
                $thumb_h    =   $fileheight*($new_height/$filewidth);
            }

            if ($filewidth < $fileheight) 
            {
                $thumb_w    =   $filewidth*($new_width/$fileheight);
                $thumb_h    =   $new_height;
            }

            if ($filewidth == $fileheight) 
            {
                $thumb_w    =   $new_width;
                $thumb_h    =   $new_height;
            }

            $dst_img        =   ImageCreateTrueColor($thumb_w,$thumb_h);

            imagecopyresampled($image_p,$image,0,0,0,0,$thumb_w,$thumb_h,$filewidth,$fileheight);

            $imageformat($image_p, $filepath_thumb);//thumb folder      



        }

    }
}
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
196
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

//set background colour white before copying
$white = imagecolorallocate($image_p, 255, 255, 255);
imagefill($image_p, 0, 0, $white);

imagecopyresampled($image_p,$image,0,0,0,0,$thumb_w,$thumb_h,$filewidth,$fileheight);

$imageformat($image_p, $filepath_thumb);//thumb folder

Кроме того, похоже, что $ dst_img не используется.

Центрирование (непроверено, но достаточно простая математика):

$xOffset = (imagesx($p_image)-$thumb_w) / 2;
$yOffset = (imagesy($p_image)-$thumb_h) / 2;

imagecopyresampled($image_p,$image,$offsetX,$offsetY,0,0,$thumb_w,$thumb_h,$filewidth,$fileheight);

Если вы знаете, какой размер не соответствует новому размеру эскиза, это можно упростить.

Спасибо большое, фон стал белым, но как я могу централизовать изображение?

Will John 20.12.2018 14:18

Центрирование изображения - довольно простая математика. $ xOffset = (imagesx ($ image) -imagesx ($ p_image)) / 2; $ yOffset = (imagesy ($ image) -imagesy ($ p_image)) / 2; и установите целевые x, y, которые в настоящее время равны 0,0, равным смещениям в imagecopyresampled. (Я тоже обновлю пост)

William_Wilson 20.12.2018 14:23

Я использовал ваш код, но возникли две проблемы. Я помещаю $ xOffset внутрь if ($ filewidth <$ fileheight) и $ yOffset внутри if ($ filewidth> $ fileheight), так как это был единственный способ что-то сработать, но когда это происходит, if ($ filewidth <$ fileheight) режет изображение как на imgur.com/a/KxfpKC7 и остается с правой стороны. Уже когда я использую if ($ filewidth> $ fileheight), все становится белым!

Will John 20.12.2018 14:54

Мне сложно догадаться, что не так, если вы не использовали опубликованный код. Обновите оригинал или добавьте отредактированную версию.

William_Wilson 20.12.2018 15:51

Я думаю, что неверно истолковал размер $ image, попробуйте отредактированную версию, отличающуюся эскизом и содержимым эскиза вместо двух изображений.

William_Wilson 20.12.2018 15:55

Большое вам спасибо, это была такая простая ошибка, чтобы понять, что я был глуп, большое вам спасибо! : D

Will John 20.12.2018 16:18

Другие вопросы по теме