Zusammenführen von zwei Bildern mit PHP


76

Ich versuche, zwei Bilder mit PHP zusammenzuführen.

Zum Beispiel ... wie würde ich vorgehen, um Bild eins über Bild zwei zu platzieren oder mit einfachem PHP zusammenzuführen? Ich habe etwas wie Wasserzeichen ausprobiert, aber es scheint nicht zu funktionieren.

Bild Eins

Alt-Text

Bild zwei

Alt-Text

... und ist daraus etwas geworden? ENDERGEBNIS:

Alt-Text


1
Zeigen Sie einfach an oder versuchen Sie, das Bild zu generieren
zod

Wenn das Wasserzeichen funktioniert, aber nicht das gewünschte Ergebnis liefert, denkt mein schiefes Denken über die Kombination von 3 Bildern nach. Das erste Bild ist ein leeres weißes Bild. Das erste Bild wird auf der linken Seite und das zweite Bild auf der rechten Seite zusammengeführt. Ich weiß, dass das Schreiben von Code als Kommentar nicht einfach sein wird. Kommentieren Sie einfach, was mir einfällt
zod

1
Bist du sicher, dass du PHP brauchst? Sie können es einfach css es
Krieg

Ich benötige PHP, wenn ich den Benutzern erlaube, das Bild herunterzuladen.
Hausaufgaben

@Homework Du hast deine Antwort unten. Aber nur zur Information: Sie können Bilder (und viele andere Dinge auch) über JavaScript und das kombinieren<canvas> Element . Das gerenderte Bild kann auch von Benutzern heruntergeladen werden, wie Sie gesagt haben.
StanE

Antworten:


121

Ich habe es von einem zum Laufen gebracht, den ich gemacht habe.

<?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
Arbeitet mit Bildern mit Transparenz.
Hausaufgaben

25

Bei der Frage geht es um das Zusammenführen von zwei Bildern. In diesem Fall sollten Sie dies jedoch nicht tun. Sie sollten Content Image (dh Cover) in <img />Tag und Style Image in CSS einfügen. Warum?

  1. Wie gesagt, das Cover gehört zum Inhalt des Dokuments, während diese Schallplatte und der Schatten nur ein Teil der Seitenstile sind.
  2. Eine solche Trennung ist viel bequemer zu verwenden. Der Benutzer kann das Bild leicht kopieren. Es ist einfacher, durch Web-Spider zu indizieren.
  3. Schließlich ist es viel einfacher zu warten.

Verwenden Sie also einen sehr einfachen Code:

<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
Danke dafür, aber ich habe nach PHP gefragt. Ich werde das immer noch retten.
Hausaufgaben

1
Wahr. Es ist einfacher für den Server, da nicht alle Bilder verarbeitet werden müssen. Und es ist auch schneller für den Benutzer, weil es nicht immer den Teil des Bildes mit dem Vinyl hat.
Nicky Smits

2
Die ausgewählte Antwort ist interessant, da wir zwei Bilder mischen und auf Facebook teilen können.
Fabio Montefuscolo

2
CSS funktioniert nur, wenn die Bilder auf einer Website verwendet werden sollen. Bilder, die in sozialen Medien geteilt, von Benutzern heruntergeladen usw. werden sollen, können nicht mit CSS erstellt werden.
Sherwin Flug

Könnten mir einige helfen, ich muss das Bild nach dem Zusammenführen speichern. Ist dies durch Schreiben von HTML möglich.
Rahul Vats

11

ImageArtist ist ein reiner GD-Wrapper, der von mir verfasst wurde. Auf diese Weise können Sie komplexe Bildmanipulationen wahnsinnig einfach durchführen, da Ihre Fragenlösung mit dieser leistungsstarken Bibliothek in nur wenigen Schritten durchgeführt werden kann.

Hier ist ein Beispielcode.

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

So sieht mein Ergebnis aus.

Geben Sie hier die Bildbeschreibung ein


Genial! Vielen Dank.
Hausaufgaben

Fantastisch! Du sparst mir Stunden!
Atomico

4

Sie können meine Funktion zum horizontalen oder vertikalen Zusammenführen von Bildern ausprobieren, ohne das Bildverhältnis zu ändern. einfach kopieren einfügen wird funktionieren.

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

Verwenden Sie die GD-Bibliothek oder ImageMagick. Ich habe 'PHP GD Merge Images' gegoogelt und mehrere Artikel dazu erhalten. In der Vergangenheit habe ich ein großes leeres Bild erstellt und dann imagecopymerge () verwendet, um diese Bilder in mein ursprüngliches leeres Bild einzufügen. In den Artikeln auf Google finden Sie einen Quellcode, den Sie sofort verwenden können.



1

Die GD Image Manipulation Library in PHP ist wahrscheinlich die beste für die Arbeit mit Bildern in PHP. Probieren Sie eine der Imagecopy-Funktionen aus (Imagecopy, Imagecopymerge, ...). Jedes von ihnen kombiniert 2 Bilder auf unterschiedliche Weise. Weitere Informationen finden Sie in der PHP-Dokumentation zu Imagecopy .


0

Füge zwei Bild-PNG und JPG / PNG zusammen [Bildmaskierung]

//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);
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.