Поместить изображение в центр другого изображения в PHP


у меня есть изображение .png например 200x200px.

Мне нужно, она всегда с 300x300px, но без увеличения изображения, просто поместив ее внутри и по центру в белый квадрат с 300x300px.

возможно ли Это? Как я могу сделать, чтобы централизовать этот образ?

, Вспомнив, что мне нужно сделать это на стороне сервера с помощью библиотеки изображений PHP.

Спасибо.

Author: Junior Zancan, 2015-11-07

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(), я подумал, что лучше разместить это для домашнего чтения:

Http://php.net/manual/en/function.imagecopyresampled.php

 3
Author: Thyago ThySofT, 2015-11-07 22:58:22

Вы можете использовать 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);
 2
Author: Guilherme Nascimento, 2015-11-07 23:09:44

Самый простой способ, это наложить одно изображение на другое, создайте образ белый 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

?>

В этом Примере-это удобно и понятно для получения более подробной информации на веб-сайте и в документации.

Надеюсь, что это помогает, объятия.

 0
Author: Mastria, 2015-11-07 22:59:50