У меня есть следующий 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
}
}
}
}






Черный - это фон по умолчанию, вам просто нужно сначала установить белый цвет фона нового изображения.
//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);
Если вы знаете, какой размер не соответствует новому размеру эскиза, это можно упростить.
Центрирование изображения - довольно простая математика. $ xOffset = (imagesx ($ image) -imagesx ($ p_image)) / 2; $ yOffset = (imagesy ($ image) -imagesy ($ p_image)) / 2; и установите целевые x, y, которые в настоящее время равны 0,0, равным смещениям в imagecopyresampled. (Я тоже обновлю пост)
Я использовал ваш код, но возникли две проблемы. Я помещаю $ xOffset внутрь if ($ filewidth <$ fileheight) и $ yOffset внутри if ($ filewidth> $ fileheight), так как это был единственный способ что-то сработать, но когда это происходит, if ($ filewidth <$ fileheight) режет изображение как на imgur.com/a/KxfpKC7 и остается с правой стороны. Уже когда я использую if ($ filewidth> $ fileheight), все становится белым!
Мне сложно догадаться, что не так, если вы не использовали опубликованный код. Обновите оригинал или добавьте отредактированную версию.
Я думаю, что неверно истолковал размер $ image, попробуйте отредактированную версию, отличающуюся эскизом и содержимым эскиза вместо двух изображений.
Большое вам спасибо, это была такая простая ошибка, чтобы понять, что я был глуп, большое вам спасибо! : D
Спасибо большое, фон стал белым, но как я могу централизовать изображение?