Слияние двух изображений с помощью PHP

Я пытаюсь объединить два изображения вместе с PHP.

Например... как мне разместить изображение один поверх изображения два или объединить с базовым PHP? Я пробовал что-то вроде водяных знаков, но, похоже, это не работает.

Первое изображение

альтернативный текст

Изображение второе

альтернативный текст

...и превратиться в это? КОНЕЧНЫЙ РЕЗУЛЬТАТ:

альтернативный текст


person homework    schedule 06.10.2010    source источник
comment
просто покажите или вы пытаетесь создать изображение   -  person zod    schedule 07.10.2010
comment
Если водяной знак работает, но не дает желаемого результата, то мой извращенный разум думает о совмещении 3-х изображений. первое изображение представляет собой пустое белое изображение, вы объединяете первое изображение слева и второе изображение справа. Я знаю, что писать код будет не так просто, как размещать комментарии. Просто прокомментируйте, что пришло мне в голову   -  person zod    schedule 07.10.2010
comment
вы уверены, что вам нужен php? вы можете легко css это   -  person warfish    schedule 14.05.2015
comment
Мне нужен PHP, если я разрешаю пользователям загружать изображение.   -  person homework    schedule 13.12.2015
comment
@Домашнее задание Вы получили ответ ниже. Но просто для информации: вы можете комбинировать изображения (и делать много других вещей) с помощью JavaScript и элемента <canvas>. Визуализированное изображение также может быть загружено пользователями, как вы сказали.   -  person StanE    schedule 11.12.2016
comment
@StanE, спасибо за эту информацию. Я многому научился за последние несколько лет.   -  person homework    schedule 12.08.2017


Ответы (8)


У меня это работает из того, что я сделал.

<?php
$dest = imagecreatefrompng('vinyl.png');
$src = imagecreatefromjpeg('cover2.jpg');

imagealphablending($dest, false);
imagesavealpha($dest, true);

imagecopymerge($dest, $src, 10, 9, 0, 0, 181, 180, 100); //have to play with these numbers for it to work for you, etc.

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

imagedestroy($dest);
imagedestroy($src);
?>
person homework    schedule 06.10.2010
comment
Работает с изображениями с прозрачностью. - person homework; 07.10.2010

Вопрос о слиянии двух изображений, однако в данном случае этого делать не следует. Вы должны поместить Изображение контента (т.е. обложку) в тег <img />, а Изображение стиля — в CSS. Почему?

  1. Как я уже сказал, обложка относится к содержимому документа, а виниловая пластинка и тень — лишь часть стилей страницы.
  2. Такое разделение гораздо удобнее в использовании. Пользователь может легко скопировать это изображение. Веб-паукам легче индексировать.
  3. Наконец, его намного проще обслуживать.

Поэтому используйте очень простой код:

<div class="cover">
   <img src="/content/images/covers/movin-mountains.png" alt="Moving mountains by Pneuma" width="100" height="100" />
</div>

.cover {
    padding: 10px;
    padding-right: 100px;

    background: url(/style/images/cover-background.png) no-repeat;
}
person Crozin    schedule 06.10.2010
comment
Спасибо за это, но я попросил PHP. Все еще собираюсь спасти это. - person homework; 07.10.2010
comment
Истинный. Это проще для сервера, потому что ему не нужно обрабатывать все изображения. И это также быстрее для пользователя, потому что у него не всегда есть часть изображения с винилом. - person Nicky Smits; 08.03.2014
comment
Выбранный ответ интересен тем, что мы можем смешать два изображения и поделиться ими на Facebook. - person Fabio Montefuscolo; 31.05.2016
comment
CSS работает только в том случае, если изображения будут использоваться на веб-сайте. Изображения для публикации в социальных сетях, загрузки пользователями и т. д. нельзя создавать с помощью CSS. - person Sherwin Flight; 19.11.2016
comment
Может кто-нибудь помочь мне, мне нужно сохранить изображение после слияния. Возможно ли это, написав html. - person Rahul Vats; 26.07.2017
comment
@Crozin, как загрузить изображение с фоновым изображением, добавленным из css, и исходным изображением в виде одного файла. - person NomanJaved; 03.05.2019

ImageArtist — это чистая gd-оболочка, созданная мной. Она позволяет выполнять сложные манипуляции с изображениями с невероятной простотой. решение вопроса можно выполнить за несколько шагов, используя эту мощную библиотеку.

вот пример кода.

$img1 = new Image("./cover.jpg");
$img2 = new Image("./box.png");
$img2->merge($img1,9,9);
$img2->save("./merged.png",IMAGETYPE_PNG);

Вот так выглядит мой результат.

введите описание изображения здесь

person imal hasaranga perera    schedule 14.09.2017
comment
Потрясающий! Спасибо. - person homework; 13.11.2017
comment
Фантастика! вы экономите мне часы! - person Atomico; 10.03.2020

Вы можете попробовать мою функцию для объединения изображений по горизонтали или вертикали без изменения соотношения сторон изображения. просто копипаст будет работать.

function merge($filename_x, $filename_y, $filename_result, $mergeType = 0) {

    //$mergeType 0 for horizandal merge 1 for vertical merge

 // Get dimensions for specified images
 list($width_x, $height_x) = getimagesize($filename_x);
 list($width_y, $height_y) = getimagesize($filename_y);


$lowerFileName = strtolower($filename_x); 
if(substr_count($lowerFileName, '.jpg')>0 || substr_count($lowerFileName, '.jpeg')>0){
    $image_x = imagecreatefromjpeg($filename_x);    
}else if(substr_count($lowerFileName, '.png')>0){
    $image_x = imagecreatefrompng($filename_x); 
}else if(substr_count($lowerFileName, '.gif')>0){
    $image_x = imagecreatefromgif($filename_x); 
}


$lowerFileName = strtolower($filename_y); 
if(substr_count($lowerFileName, '.jpg')>0 || substr_count($lowerFileName, '.jpeg')>0){
    $image_y = imagecreatefromjpeg($filename_y);    
}else if(substr_count($lowerFileName, '.png')>0){
    $image_y = imagecreatefrompng($filename_y); 
}else if(substr_count($lowerFileName, '.gif')>0){
    $image_y = imagecreatefromgif($filename_y); 
}


if($mergeType==0){
    //for horizandal merge
     if($height_y<$height_x){
        $new_height = $height_y;

        $new_x_height = $new_height;
        $precentageReduced = ($height_x - $new_height)/($height_x/100);
        $new_x_width = ceil($width_x - (($width_x/100) * $precentageReduced));

         $tmp = imagecreatetruecolor($new_x_width, $new_x_height);
        imagecopyresampled($tmp, $image_x, 0, 0, 0, 0, $new_x_width, $new_x_height, $width_x, $height_x);
        $image_x = $tmp;

        $height_x = $new_x_height;
        $width_x = $new_x_width;

     }else{
        $new_height = $height_x;

        $new_y_height = $new_height;
        $precentageReduced = ($height_y - $new_height)/($height_y/100);
        $new_y_width = ceil($width_y - (($width_y/100) * $precentageReduced));

         $tmp = imagecreatetruecolor($new_y_width, $new_y_height);
        imagecopyresampled($tmp, $image_y, 0, 0, 0, 0, $new_y_width, $new_y_height, $width_y, $height_y);
        $image_y = $tmp;

        $height_y = $new_y_height;
        $width_y = $new_y_width;

     }

     $new_width = $width_x + $width_y;

     $image = imagecreatetruecolor($new_width, $new_height);

    imagecopy($image, $image_x, 0, 0, 0, 0, $width_x, $height_x);
    imagecopy($image, $image_y, $width_x, 0, 0, 0, $width_y, $height_y);

}else{


    //for verical merge
    if($width_y<$width_x){
        $new_width = $width_y;

        $new_x_width = $new_width;
        $precentageReduced = ($width_x - $new_width)/($width_x/100);
        $new_x_height = ceil($height_x - (($height_x/100) * $precentageReduced));

        $tmp = imagecreatetruecolor($new_x_width, $new_x_height);
        imagecopyresampled($tmp, $image_x, 0, 0, 0, 0, $new_x_width, $new_x_height, $width_x, $height_x);
        $image_x = $tmp;

        $width_x = $new_x_width;
        $height_x = $new_x_height;

     }else{
        $new_width = $width_x;

        $new_y_width = $new_width;
        $precentageReduced = ($width_y - $new_width)/($width_y/100);
        $new_y_height = ceil($height_y - (($height_y/100) * $precentageReduced));

         $tmp = imagecreatetruecolor($new_y_width, $new_y_height);
        imagecopyresampled($tmp, $image_y, 0, 0, 0, 0, $new_y_width, $new_y_height, $width_y, $height_y);
        $image_y = $tmp;

        $width_y = $new_y_width;
        $height_y = $new_y_height;

     }

     $new_height = $height_x + $height_y;

     $image = imagecreatetruecolor($new_width, $new_height);

    imagecopy($image, $image_x, 0, 0, 0, 0, $width_x, $height_x);
    imagecopy($image, $image_y, 0, $height_x, 0, 0, $width_y, $height_y);

}





$lowerFileName = strtolower($filename_result); 
if(substr_count($lowerFileName, '.jpg')>0 || substr_count($lowerFileName, '.jpeg')>0){
    imagejpeg($image, $filename_result);
}else if(substr_count($lowerFileName, '.png')>0){
    imagepng($image, $filename_result);
}else if(substr_count($lowerFileName, '.gif')>0){
    imagegif($image, $filename_result); 
}


 // Clean up
 imagedestroy($image);
 imagedestroy($image_x);
 imagedestroy($image_y);

}


merge('images/h_large.jpg', 'images/v_large.jpg', 'images/merged_har.jpg',0); //merge horizontally
merge('images/h_large.jpg', 'images/v_large.jpg', 'images/merged.jpg',1); //merge vertically
person lingeshram    schedule 21.03.2018

Используйте библиотеку GD или ImageMagick. Я погуглил «Объединение изображений PHP GD» и получил несколько статей об этом. В прошлом я создавал большое пустое изображение, а затем использовал imagecopymerge(), чтобы вставить эти изображения в исходное пустое изображение. Ознакомьтесь со статьями в Google, вы найдете исходный код, который вы можете начать использовать прямо сейчас.

person slim    schedule 06.10.2010

Это можно сделать с помощью расширения ImageMagick. Я предполагаю, что метод CombineImages() будет делать то, что вы хотите.

person Alex Howansky    schedule 06.10.2010

Библиотека обработки изображений GD в PHP, вероятно, лучше всего подходит для работы с изображениями в PHP. Попробуйте одну из функций копирования изображений (imagecopy, imagecopymerge, ...). Каждый из них объединяет 2 изображения по-разному. Дополнительную информацию см. в документации php по imagecopy.

person Joel    schedule 06.10.2010

Объединение двух изображений png и jpg/png [Маскирование изображения]

//URL or Local path
$src_url = '1.png';
$dest_url = '2.jpg';
$src = imagecreatefrompng($src_url);
$dest1 = imagecreatefromjpeg($dest_url);

//if you want to make same size
list($width, $height) = getimagesize($dest_url);
list($newWidth, $newHeight) = getimagesize($src_url);
$dest = imagecreatetruecolor($newWidth, $newHeight);

imagecopyresampled($dest, $dest1, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

list($src_w, $src_h) = getimagesize($src_url);

//merger with same size
$this->imagecopymerge_alpha($dest, $src, 0, 0, 0, 0, $src_w, $src_h, 100);

//show output on browser
header('Content-Type: image/png');
imagejpeg($dest);

imagecopymerge_alpha

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
    {
        $cut = imagecreatetruecolor($src_w, $src_h);
        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct);
    }
person ajmirani    schedule 05.05.2020