Поместить изображение в центр другого изображения в PHP
у меня есть изображение .png например 200x200px.
Мне нужно, она всегда с 300x300px, но без увеличения изображения, просто поместив ее внутри и по центру в белый квадрат с 300x300px.
возможно ли Это? Как я могу сделать, чтобы централизовать этот образ?
, Вспомнив, что мне нужно сделать это на стороне сервера с помощью библиотеки изображений PHP.
Спасибо.
3 answers
Я Считаю, что вы пытаетесь сделать это через форму для передачи изображения, поэтому я подготовил ответ, думая об этом.
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" name="ok" value="Enviar" />
</form>
<?php
$tempname = $_FILES["img"]["tmp_name"]; // Caminho completo da imagem original.
$extension = strtolower(pathinfo($_FILES["img"]["name"], PATHINFO_EXTENSION)); // Extraindo extensão com 'pathinfo' da imagem original.
$name = "new_img"; // Nome do novo arquivo de imagem
$url = "images/".$name.".".$extension; // Caminho onde será salvo a nova imagem
$max_width = 300; // Largura final da imagem
$max_height = 300; // Altura final da imagem
$allowed_extensions = array('gif', 'jpg', 'png'); // Extensões permitidas
if(in_array($extension, $allowed_extensions)) { // Se extensão é permitida...
move_uploaded_file($tempname, $url); // Move para o caminho definido em '$url'
} else return "Arquivo não permitido.";
// Pega a largura, altura, tipo e atributo da imagem
list($image_width, $image_height, $type, $attribute) = getimagesize($url);
// Calcula o coeficiente para centralização
$x = round(($max_width - $image_width) / 2);
$y = round(($max_height - $image_height) / 2);
// Cria uma nova imagem com o novo tamanho
$new_image = imagecreatetruecolor($max_width, $max_height);
// Define o background desta nova imagem (RGB), neste caso, 'branco' como precisa.
$bg = imagecolorallocate($new_image, 255, 255, 255);
imagefill($new_image, 0, 0, $bg);
switch ($type){
case 1: // Se a imagem for GIF...
$source = imagecreatefromgif($url); // Pega a imagem original GIF
imagecopyresampled($new_image, $source, $x, $y, 0, 0, $image_width, $image_height, $image_width, $image_height);
imagegif($new_image, $url); // Gera a nova imagem sobrescrevendo a original
break;
case 2: // Se a imagem for JPG...
$source = imagecreatefromjpeg($url); // Pega a imagem original JPG
imagecopyresampled($new_image, $source, $x, $y, 0, 0, $image_width, $image_height, $image_width, $image_height);
imagejpeg($new_image, $url, 70); // Gera a nova imagem sobrescrevendo a original (com resolução de 70 (vai de 0 à 100))
break;
case 3: // Se a imagem for PNG...
$source = imagecreatefrompng($url); // Pega a imagem original PNG
imagecopyresampled($new_image, $source, $x, $y, 0, 0, $image_width, $image_height, $image_width, $image_height);
imagepng($new_image, $url, 9); // Gera a nova imagem sobrescrevendo a original (com compactação de 9 (vai de 0 à 9))
break;
}
// Destrói as imagens criadas
imagedestroy($new_image);
imagedestroy($source);
, Только не ставлю отзыв для функции imagecopyresampled()
, я подумал, что лучше разместить это для домашнего чтения:
Вы можете использовать imagecopymerge
ведь это, как описано в документации:
bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x ,
int $dst_y , int $src_x , int $src_y , int $src_w ,
int $src_h , int $pct )
См., например, прочитайте комментарии в коде:
<?php
$dest = imagecreatefromjpeg('foto.jpg'); //Pega a imagem principal
$marcadagua = imagecreatefromgif('marcadagua.gif'); //Pega a imagem que vai ser centralizada
//pega o tamanho da imagem principal
$dwidth = imagesx($dest);
$dheight = imagesy($dest);
//pega o tamanho da imagem que vai ser centralizada
$mwidth = imagesx($marcadagua);
$mheight = imagesy($marcadagua);
//Calcula a x e y posição pra colocar a imagem no centro da outra
//A função round arredonda os valores
$xPos = round(($dwidth - $mwidth) / 2);
$yPos = round(($dheight - $mheight) / 2);
imagecopymerge($dest, $marcadagua, $xPos, $yPos, 0, 0, $mwidth, $mheight, 100);
header('Content-Type: image/jpeg');
imagejpeg($dest);
//destrói resources
imagedestroy($dest);
imagedestroy($marcadagua);
Вы можете изменить последний аргумент дополнительные сделать изображение менее непрозрачным, то есть немного прозрачной, например, если вы сделаете это изображение централизованного станет чуть стерта:
imagecopymerge($dest, $marcadagua, $xPos, $yPos, 0, 0, $mwidth, $mheight, 70);
Самый простой способ, это наложить одно изображение на другое, создайте образ белый 300x300, чтобы служить в качестве основы, мне очень нравится использовать библиотеку WideImage, легкий и без многих осложнений, следует пример:
<?php
require_once('lib/WideImage.php');
$base = WideImage::load('white.jpg'); // carregue sua base
$imagem = WideImage::load('imagem.jpg'); // carregue sua imagem
$base->merge($imagem, 50, 50, 100)->saveToFile('resultado.jpg'); // faça o merge
?>
В этом Примере-это удобно и понятно для получения более подробной информации на веб-сайте и в документации.
Надеюсь, что это помогает, объятия.