Combiner 2-3 images PNG transparentes l'une sur L'autre avec PHP

je travaille sur un système avatar personnalisé pour un projet, mais je n'ai jamais vraiment fait grand chose avec le côté image de PHP. Je suppose que j'ai besoin d'utiliser GD d'une façon ou d'une autre, mais je ne sais pas par où commencer.

en gros, il y a un tas d'images PNG transparentes pré-faites. Les utilisateurs peuvent sélectionner 2-3 d'entre eux de personnaliser leur avatar, et je veux être en mesure de prendre ces images et faire une seule image d'eux pour être stocké dans un dossier.

24
demandé sur James Simpson 2009-09-09 07:17:54

5 réponses

$image_1 = imagecreatefrompng('image_1.png');
$image_2 = imagecreatefrompng('image_2.png');
imagealphablending($image_1, true);
imagesavealpha($image_1, true);
imagecopy($image_1, $image_2, 0, 0, 0, 0, 100, 100);
imagepng($image_1, 'image_3.png');
55
répondu Jonathan Patt 2009-09-09 07:29:46

cela m'a aidé à créer une image PNG à partir de 3 autres fichiers PNG pour créer une image filigranée avec un fond. Espérons que cela aide quelqu'un d'autre.


$bgFile = __DIR__ . "/background-layer-1.png"; // 93 x 93

Background Layer

$imageFile = __DIR__ . "/icon-layer-2.png"; // 76 x 76

Icon Image Layer

$watermarkFile = __DIR__ . "/stars-layer-3.png"; // 133 x 133 (Est des étoiles blanches)

Watermark

<?php
// Download the image files if we don't have them
function get_file($file, $from) {
    if (!file_exists(__DIR__ . "/" . $file)) { file_put_contents(__DIR__ . "/" . $file, file_get_contents($from)); }
}
get_file("background-layer-1.png", "http://i.imgur.com/6pgf3WK.png");
get_file("icon-layer-2.png", "http://i.imgur.com/0sJt52z.png");
get_file("stars-layer-3.png", "http://i.imgur.com/1Tvlokk.png");

$bgFile = __DIR__ . "/background-layer-1.png"; // 93 x 93
$imageFile = __DIR__ . "/icon-layer-2.png"; // 76 x 76
$watermarkFile = __DIR__ . "/stars-layer-3.png"; // 133 x 133

// We want our final image to be 76x76 size
$x = $y = 76;

// dimensions of the final image
$final_img = imagecreatetruecolor($x, $y);

// Create our image resources from the files
$image_1 = imagecreatefrompng($bgFile);
$image_2 = imagecreatefrompng($imageFile);
$image_3 = imagecreatefrompng($watermarkFile);

// Enable blend mode and save full alpha channel
imagealphablending($final_img, true);
imagesavealpha($final_img, true);

// Copy our image onto our $final_img
imagecopy($final_img, $image_1, 0, 0, 0, 0, $x, $y);
imagecopy($final_img, $image_2, 0, 0, 0, 0, $x, $y);
imagecopy($final_img, $image_3, 0, 0, 0, 0, $x, $y);

ob_start();
imagepng($final_img);
$watermarkedImg = ob_get_contents(); // Capture the output
ob_end_clean(); // Clear the output buffer

header('Content-Type: image/png');
echo $watermarkedImg; // outputs: `http://i.imgur.com/f7UWKA8.png`

extrants:

Result

6
répondu Anil 2014-12-15 13:59:10

peut Également être fait de cette façon. Espérons que cela sera utile pour les futurs visiteurs.

$base = imagecreatefrompng('your base image path');
//logo is transparent: in this case stackoverflow logo
$logo = imagecreatefrompng("path for image with transparent background");

//Adjust paramerters according to your image
imagecopymerge_alpha($base, $logo, 60, 60, 0, 0, 300, 200, 100);

header('Content-Type: image/png');
imagepng($base);

//@see: http://php.net/manual/en/function.imagecopymerge.php for below function in first comment
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ 
        // creating a cut resource 
        $cut = imagecreatetruecolor($src_w, $src_h); 

        // copying relevant section from background to the cut resource 
        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); 

        // copying relevant section from watermark to the cut resource 
        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); 

        // insert cut resource to destination image 
        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct); 
    } 

Exemple Pratique: C'est l'Image d'arrière-plan enter image description here

C'est le logo de stackoverflow.

enter image description here

Ceci est le Résultat combiné.

enter image description here

2
répondu sinsuren 2016-10-17 13:03:55

Ce que vous voulez utiliser sont les PHP ImageMagick utilitaires.

spécifiquement, le combinaisons D'images la commande.

1
répondu Mike Buckbee 2009-09-09 03:30:41

certainement en utilisant la bibliothèque GD.

<?php

$final_img = imagecreate($x, $y); // where x and y are the dimensions of the final image

$image_1 = imagecreatefrompng('image_1.png');
$image_2 = imagecreatefrompng('image_2.png');
$image_3 = imagecreatefrompng('image_3.png');
imagecopy($image_1, $final_img, 0, 0, 0, 0, $x, $y);
imagecopy($image_2, $final_img, 0, 0, 0, 0, $x, $y);
imagecopy($image_3, $final_img, 0, 0, 0, 0, $x, $y);

imagealphablending($final_img, false);
imagesavealpha($final_img, true);
if($output_to_browser){

header('Content-Type: image/png');
imagepng($final_img);

}else{
// output to file

imagepng($final_img, 'final_img.png');

}

?>
1
répondu mauris 2009-09-09 12:46:28