Place an image in the center of another image in PHP

2

I have a .png image of eg 200x200px.

I need it to stay 300x300px, but without enlarging the image, just putting it in and centering on a white square of 300x300px.

Is this possible? How can I centralize this image?

Remembering that I need to do this on the server side, using the PHP image library.

Thank you.

    
asked by anonymous 07.11.2015 / 23:04

3 answers

3

I think you're trying to do this through a form for submitting the image, so I worked out an answer thinking about it.

<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);

I just did not comment on the imagecopyresampled() function, I thought I'd better post this suggested reading:

  

link

    
07.11.2015 / 23:58
2

You can use imagecopymerge for this, as described in the documentation:

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 )

See an example, read the comments inside the code:

<?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);

You can change the last argument to make the image less opaque, or a little transparent, for example, if you do this the centered image will be slightly erased:

imagecopymerge($dest, $marcadagua, $xPos, $yPos, 0, 0, $mwidth, $mheight, 70);
    
07.11.2015 / 23:53
0

The easiest way is to superimpose one image on the other, create a 300x300 white image to serve as a base, I really enjoy using the WideImage library. a>, is light and without many complications, follow the example:

<?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

?>

The example is very intuitive, for more information access the site and the documentation.

Hope it helps, hugs.

    
07.11.2015 / 23:59