ImageCreate mehrere Ebenen


Pyrbel

Grünschnabel
#1
Hallo

Beim Versuch ein Bild mittels ImageCreate stoße ich an meine Grenzen.
Einfach gesagt versuch ich gerade ein Bild (BILD 1) einer Person (Avatar) mittels imagecreatefromstring anzuzeigen, anschließend soll der Hintergrund transparent gemacht werden.
Nun Soll das selbe Bild (BILD 2) der Person erneut geladen werden und mittels Schablone (siehe Bild) der Arm ausgeschnitten werden, damit ich diesen verdreht und gespiegelt wieder auf das 1 Bild positionieren kann. Das selbe mach ich mit den Füssen auch.

Nun das Problem: Alles funktioniert und ist transparent wie es sein sollte. Bis ich es als Gif mit der Classe von hier laden möchte. Dann wird der Hintergrund nämlich entweder gar nicht erst transparent oder mit imagetruecolortopalette($im_1_1, true, 255); eben einfach Schwarz.

Kennt jemand das Problem? Oder weiß Rat? Besten Dank

Schablone:
cut.gif fuss.gif


Code:
$im = imagecreatetruecolor(64, 110);

$farbe_body = imagecolorallocate( $im, 255, 0, 255);
imagefill ( $im, 0, 0, $farbe_body );

imagecolortransparent($im, $farbe_body);

$userimage = imagecreatefromstring("$userimage");
imagecopy($im, $userimage, 0, 0, 0, 0, 64, 80);

$cut = imagecreatefromgif("cut_image.gif");
imagecopy($im_1, $cut, 0, 0, 0, 0, 64, 110);



$im_1 = imagecreatetruecolor(110, 110);

$farbe_body_1 = imagecolorallocate ( $im_1, 255, 0, 255 );

imagefill ( $im_1, 0, 0, $farbe_body_1 );
imagecolortransparent($im_1, $farbe_body_1);

$userimage_2 = imagecreatefromstring("$userimage");
imagecopy($im_1, $userimage_2, -3, 0, 0, 0, 64, 90);

$farbe_body_2 = imagecolorallocate ( $im_1, 255, 0, 255 );
imagefill ( $im_3, 0, 0, $farbe_body_2 );
imagecolortransparent($im_1, $farbe_body_2);

$farbe_body_3 = imagecolorallocate($im_1, 255, 0, 255);
$cut_2 = imagecreatefromgif("cut_image_2.gif");

imagecopy($im_1, $cut_2, 0, -1, 0, 0, 64, 110);
imagecolortransparent($im_1, $farbe_body_3);

imagecopymerge($im, $im_1, 3, 0, 0, 0, 64, 110, 100);


$frames = array($im);

$durations = array(20, 20, 20, 20);

$gc = new GifCreator\GifCreator();
$gc->create($frames, $durations, 5);

$gifBinary = $gc->getGif();

header('Content-type: image/gif');
header('Content-Disposition: filename="butterfly.gif"');
echo $gifBinary;
exit;
Mir wurde dies von einem Freund empfohlen:

Code:
function check_transparent($im) {
  $width = imagesx($im);
  $height = imagesy($im);
  $pixels = array();
  for($i = 0; $i < $width; $i++) {
      for($j = 0; $j < $height; $j++) {
          $rgba = imagecolorat($im, $i, $j);
          $index = imagecolorsforindex($im, $rgba);
          if($index['alpha'] == 127) {
              $pixels[] = array($i, $j);
          }
      }
  }
  return $pixels;
}

function replacePixels($im,$pixels){
  $color = imagecolorallocatealpha($im, 0, 0, 0, 127);
  foreach($pixels as $pixel)
      imagesetpixel($im, $pixel[0], $pixel[1], $color);
}
Es funktioniert bei einem Bild. Sobald ich jedoch eine weitere ebene aufs Bild hinzufüge und diese dann auch transparent mache scheint der Code nicht mehr zu funktionieren, oder macht nur eine der vielen Ebenen transparent.
 
#2
Ohne "echte" Daten ist das Nachbauen meist zu aufwändig.
Aber beim Überfliegen deines Codes fällt auf:

$cut = imagecreatefromgif("cut_image.gif");
imagecopy($im_1, $cut, 0, 0, 0, 0, 64, 110);

$im_1 = imagecreatetruecolor(110, 110);

Du kopierst etwas - das Du vermutlich benötigst - in ein Image, das Du erst später erzeugst. Da würde ich schon erwarten, dass das nicht erwartungsgemäss klappt.
 

Pyrbel

Grünschnabel
#3
Okey kann ich nachvollziehen.
Aber wenn du ein Bild bearbeitest und dafür mehrere "ebenen" brauchst würdest die ja auch erst am Schluss zusammen führen und nicht bei beginn der nächsten ebene.
 

Neue Beiträge