Brauche kleine Hilfestellung bei PHP image()

moreplz

Grünschnabel
Hallo zusammen. Ich habe das Vorhaben 2 Bilder untereinander anzureihen.

Um es kurz zu verdeutlichen: aus..
Code:
[A] (a.jpg) und [B] (b.jpg) soll..

[A]
[B]
..ein Bild test.jpg werden. Nun hab ich nach langem selbstversuch aufgegeben und doch Google zur Hilfe gezogen und hab folgende Funktion gefunden:

PHP:
<?php
function merge_images($images, $path) {
    $width = 0;
    $height = 0;
    $gd_ressources = array();
    foreach($images as $image) {
        $tmp = array();
        $error = false;
        if(!file_exists($image) || !is_file($image)) {
            trigger_error('The image file ' . $image . ' does not exist', E_USER_WARNING);
            continue;
        }
        $size = @getimagesize($image);
        if(!is_array($size) || $size[2] == 4) {
            trigger_error('The file ' . $image . ' seems not to be a valid image', E_USER_WARNING);
            continue;
        }
        $tmp['width'] = $size[0];
        $tmp['height'] = $size[1];
        switch($size[2]) {
            case 1:
                $tmp['gd'] = imagecreatefromgif($image);
                break;
            case 2:
                $tmp['gd'] = imagecreatefromjpeg($image);
                break;
            case 3:
                $tmp['gd'] = imagecreatefrompng($image);
                break;
        }
        $width += $size[0];
        $height = max($size[1], $height);
        $gd_ressources[] = $tmp;
    }
    $dst_image = imagecreatetruecolor($width, $height);
     $x = 0;
     foreach($gd_ressources as $gd) {
         imagecopy($dst_image, $gd['gd'], $x, 0, 0, 0, $gd['width'], $gd['height']);
        $x += $gd['width'];
     }
    imagejpeg($dst_image, $path);
}



$images = array('b.jpg', 'p.jpg');
merge_images($images, 'test.jpg')
?>

Allerdings stellt diese die Bilder nebeneinander [A][B] (test.jpg), was ja nicht so ganz das ist was ich möchte.. :)

Kann mir jemand erklären wie ich das zu ändern habe, dass es geht? Bin eher ein PHP-Neulign und kenne mich bisher nur mit Basics aus udn das übertrift mein "Können"..

Wäre sehr nett, wenn mir dabei jemand helfen könne.


LG
moreplz
 
Hi,

habe mal den Code durchgearbeitet und ein paar Änderungen gemacht. Im Prinzip musst du nur alles, was mit der Breite rechnet durch die Höhe ersetzen. Später dann mal aus einem $x ein $y machen und in der imagecopy() halt entsprechend die Parameter anpassen.

PHP:
<?php
function merge_images($images, $path) {
    $width = 0;
    $height = 0;
    $gd_ressources = array();
    foreach($images as $image) {
        $tmp = array();
        $error = false;
        if(!file_exists($image) || !is_file($image)) {
            trigger_error('The image file ' . $image . ' does not exist', E_USER_WARNING);
            continue;
        }
        $size = @getimagesize($image);
        if(!is_array($size) || $size[2] == 4) {
            trigger_error('The file ' . $image . ' seems not to be a valid image', E_USER_WARNING);
            continue;
        }
        $tmp['width'] = $size[0];
        $tmp['height'] = $size[1];
        switch($size[2]) {
            case 1:
                $tmp['gd'] = imagecreatefromgif($image);
                break;
            case 2:
                $tmp['gd'] = imagecreatefromjpeg($image);
                break;
            case 3:
                $tmp['gd'] = imagecreatefrompng($image);
                break;
        }
        $height += $size[1];
        $width = max($size[0], $width);
        $gd_ressources[] = $tmp;
    }
    $dst_image = imagecreatetruecolor($width, $height);
     $y = 0;
     foreach($gd_ressources as $gd) {
         imagecopy($dst_image, $gd['gd'], 0, $y, 0, 0, $gd['width'], $gd['height']);
        $y += $gd['height'];
     }
    imagejpeg($dst_image, $path);
}



$images = array('b.jpg', 'p.jpg');
merge_images($images, 'test.jpg')
?>

Das ganze ist ungetestet. Wenn nicht geht, dann vergleich am Besten mal meine Version mit deiner und schau was ich da so versucht habe zu ändern. Vielleicht kommst ja dann alleine auf die Lösung ;)

Gruß
BK
 
Das Zielbild nicht breister, sondern höher machen:
PHP:
        $width += $size[0];
        $height = max($size[1], $height);
//durch das folgende ersetzen
        $width = max($size[0], $width);
        $height += $size[1];

das 2te bild darunter und nicht nebenan kopieren:
PHP:
$x = 0; 
......
         imagecopy($dst_image, $gd['gd'], $x, 0, 0, 0, $gd['width'], $gd['height']);
        $x += $gd['width']; 
//ersetzen durch
$y = 0; 
.....
         imagecopy($dst_image, $gd['gd'], 0, $y, 0, 0, $gd['width'], $gd['height']);
        $y += $gd['height'];

Das ganze ist natürlich nicht getestet.

Nachtrag: Mist, zu spät....
 
Super, vielen Dank ihr 2 für die schnelle Hilfe! Hab nun schnell Bratkartoffel seine Lösung genutzt und werd mir deine, yaslaw, auch ncohaml anschauen - lernen kann man sicher etwas..

Also Danke nochmal!
 
Hi yaslaw,

deine Lösung zeigt eigentlich genau meine Änderungen (ist quasi übersichtlicher)... Somit müsste das eigentlich funktionieren ;)

Gruß
BK
 
Zurück