Злиття двох зображень з 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.