Злиття двох зображень з PHP


77

Я намагаюся об'єднати два зображення разом з PHP.

Наприклад ... як би я розмістив зображення один поверх зображення два або об'єднав з базовим PHP? Я пробував щось на зразок водяних знаків, але, здається, це не працює.

Зображення перше

текст заміщення

Зображення друге

текст заміщення

... і це перетвориться на це? Остаточний результат:

текст заміщення


1
просто відобразити або ю намагається сформувати зображення
zod

Якщо водяний знак працює, але не дає результату, як ви хотіли, мій кривий розум замислюється про поєднання 3-х зображень. перше зображення - це порожнє біле зображення, u злийте перше зображення на лівій стороні та друге зображення на правому боці. Я знаю, що написання коду буде непростим, оскільки розміщення коментарів. Просто прокоментуйте, що це мені на думку
zod

1
ви впевнені, що вам потрібен php? Ви можете це легко зробити
warfish

Мені потрібен PHP, якщо я дозволяю користувачам завантажувати зображення.
домашнє завдання

@Homework Ви отримали свою відповідь нижче. Але лише для інформації: Ви можете комбінувати зображення (і робити багато іншого) також за допомогою JavaScript та <canvas>елемента. Візуалізоване зображення також можуть завантажити користувачі, як ви вже сказали.
StanE

Відповіді:


121

Я працював з одного, який я зробив.

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

4
Працює над зображеннями з прозорістю.
домашнє завдання

25

Питання про об’єднання двох зображень, однак у цьому конкретному випадку ви не повинні цього робити. Ви повинні помістити Зміст зображення (тобто обкладинку) в <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;
}

3
Дякую за це, але я попросив PHP. Все ще збираюся врятувати це.
домашнє завдання

1
Правда. Це простіше для сервера, оскільки йому не потрібно обробляти всі зображення. І це також швидше для користувача, оскільки він не має частину зображення з вінілом весь час.
Нікі Смітс

2
Вибрана відповідь цікава, оскільки ми можемо поєднати два зображення та поділитися на Facebook.
Фабіо Монтефусколо,

2
CSS працює лише в тому випадку, якщо зображення потрібно використовувати на веб-сайті. Зображення, якими слід ділитися в соціальних мережах, завантажувати їх користувачами тощо, не можна створювати за допомогою CSS.
Рейс Шервіна

Може мені допомогти мені потрібно зберегти зображення після злиття. Чи можливо це написанням html.
Рахул Вац

11

ImageArtist - це чисто обгортка GD, автором якої я є, це дозволяє надзвичайно легко виконувати складні маніпуляції із зображеннями, оскільки вирішення вашого питання може бути виконане за кілька кроків за допомогою цієї потужної бібліотеки.

ось зразок коду.

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

Ось так виглядає мій результат.

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


Чудово! Дякую.
домашнє завдання

Фантастично! ти економиш мені години!
Атоміко

4

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

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

2

Використовуйте бібліотеку GD або ImageMagick. Я погуглив "Злиття зображень PHP GD" і отримав кілька статей про це. Раніше я створив велике порожнє зображення, а потім використовував imagecopymerge (), щоб вставити ці зображення в моє оригінальне порожнє. Переглянувши статті в google, ви знайдете вихідний код, який ви можете почати використовувати одразу.



1

Бібліотека маніпулювання зображеннями GD у PHP, мабуть, найкраща для роботи із зображеннями в PHP. Спробуйте одну з функцій копіювання (imagecopy, imagecopymerge, ...). Кожен з них по-різному поєднує 2 зображення. Для отримання додаткової інформації див. Документацію до php на imagecopy .


0

Злиття двох зображень 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);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.