@ObehanProger

Как поместить изображение в шаблон с помощью PHP?

Пытаюсь разместить произвольную картинку 1920x1080 в стандартной белой 400x300:
//путь к картинке
              $img_initial='/files/source.jpg';
              $img_i = imagecreatefromjpeg($img_initial);// Создаём дескриптор для работы с исходным изображением
              // Создаем шаблон
              $img_o = imagecreatetruecolor($w_o, $h_o);
              // Создаём белый цвет фона
              $white = imagecolorallocate($img_o, 255, 255, 255);
              imagecolortransparent($img_o, $white);
              //пробовал также imagefill($img_o, 0, 0, $white);
              //размеры исходного изображения 1920x1080, поэтому
              $ratio=1080/300;
              $x_i=(1920-1920*$ratio)/2; //сколько отступать от края по горизонтали
             //переносим изображение в шаблон
             imagecopyresampled($img_o, $img_i, 0, 0, $x_i, 0, 400, 300, 1920-2*$x_i, 1080);
             return imagejpeg($img_o, '/files/example.jpg');

В итоге получается картинка с черным фоном вокруг. Как исправить?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
$img = 'test.jpg'; // исходник

$image = imagecreatefromstring(file_get_contents($img)); // ресурс исходника

# прозрачность
imagesavealpha($image, true);
imagealphablending($image, false);

# замеры исходника
$image_w = imagesx($image); // 1920
$image_h = imagesy($image); // 1080

# вычисляем размеры чтоб сохранить пропорции
$params = ['width' => 400, 'height' => $image_h * (400 / $image_w)]; // 400 x 225

# прозрачная подложка
$newimage = imagecreatetruecolor($params['width'], $params['height']);
$transparent = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparent);
imagealphablending($newimage, true);
imagesavealpha($newimage, true);

# уменьшаем
imagecopyresampled($newimage, $image, 0, 0, 0, 0, $params['width'], $params['height'], $image_w, $image_h);

# прозрачная подложка для итогового изображения
$background = imagecreatetruecolor(400, 300);
$transparent = imagecolorallocatealpha($background, 255, 255, 255, 127);
imagefill($background, 0, 0, $transparent);
imagealphablending($background, true);
imagesavealpha($background, true);

/*
 300 - $params['height']) / 2 -> ровнение по центру
 сохраняем
*/
imagecopyresampled($background, $newimage, 0, (300 - $params['height']) / 2, 0, 0, $params['width'], $params['height'], $params['width'], $params['height']);

imagepng($background, 'test.png', 9, PNG_ALL_FILTERS);

исходник
5d3960aac3b1c157151307.jpeg
результат
5d3960bfac93e626534890.png
проверка прозрачности (оранжевый фон сайта)
echo '<img src="test.png" alt="image" style="background-color: orange;" />';

5d396126d595a206710977.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы