[PHP/GD Library] Problem mit Transparenz

martin

Well-Known Member
Hallo Forum

wie der Titel schon sagt, möchte ich gerne Transparenz in ein mit GD erstelltes Bild bekommen. Dabei habe ich etwas gegoogelt und bin auch einen kleinen Schritt weiter gekommen. Hier mal etwas Code:

PHP:
<?php
// Create a blank image to test with.
$gfx = imagecreatetruecolor(200, 200);

// Declare just two colors, a bright green, and blue
$blue = imagecolorallocate($gfx, 0, 0, 255);
$green = imagecolorallocate($gfx, 0, 255, 0);
$red = imagecolorallocate($gfx, 255, 0, 0);
$color = imagecolorallocate($gfx, 155, 155, 155);

// Make the entire background green
imagefilledrectangle($gfx, 0, 0, 199, 199, $green);

// Make two shapes
imagefilledrectangle($gfx, 0, 0, 199, 100, $color);
imagefilledrectangle($gfx, 100, 0, 199, 199, $red);

// Draw a blue circle on the image:
imagefilledellipse($gfx, 100, 100, 30, 30, $blue);

$tmp = detail1();
imagecopy($gfx,$tmp,75,25,0,0,imagesx($tmp),imagesy($tmp));

// Set the green color as transparent:
imagecolortransparent($gfx, $green);

function detail1(){
    $test = imagecreatetruecolor(50, 50);
    $blue = imagecolorallocate($test, 0, 0, 255);
    $green = imagecolorallocate($test, 0, 255, 0);
    imagefilledrectangle($test, 0, 0, 50, 50, $green);
    imagefilledellipse($test, 25, 25, 50, 50, $blue);
    imagecolortransparent($test,$green);
    return $test;
}

// Output our sample as a PNG
header('Content-type: image/png');
imagepng($gfx);
?>

In dem geposteten Code (Bild) wird eine kleine blaue Kugel angezeigt (25px), wo Transparenz funktioniert, genau so, wie ich das brauche. Bei der größeren blauen Kugel (50px), die über eine separate Funktion "detail1" erstellt- und dann kopiert wird, funktioniert das Ganze leider nicht mehr.
Das zu erstellende Bild ist ziemlich komplex und besteht aus vielen kleinen "Bauteilen", die alle samt in separaten Funktionen erstellt werden und dann an die entsprechenden Positionen kopiert werden mit imagecopy (so wie im Bsp. Code zu sehen). Aus diesem Grund kann ich nicht einfach die Lösung mit der kleinen blauen Kugel nehmen, sonder muss irgendwie die Transparenz mit in die Funktions bringen, nur will es mir nicht gelingen.
 
imagecopymerge() unterstützt Transparenz.

Ein anderer Weg wäre der Funtion eine Referenz deines Bildes mitzugeben und direkt im Bild zu arbeiten.
 
@troll
imagecopymerge unterstützt Transparenz, ja, aber leider wird das gesamte Bild dadurch Transparent, d.h. wenn ich z.B. Faktor 50 nehme, sind "volle" Flächen halb durchsichtig. An den "Ecken" des Kreises ändert das jedoch nichts, auch diese werden dadurch lediglich halb-transparent.
Das Übergeben der Referenz des Bildes ist mit sehr viel Aufwand verbunden, würde ich möglichst vermeiden.

@KobReThilla
leider geht es auch mit dem Bsp. in deinem Link nicht. Folgendes habe ich probiert:
PHP:
function detail1(){
    $test = imagecreatetruecolor(50, 50);
    $blue = imagecolorallocate($test, 0, 0, 255);
    $green = imagecolorallocate($test, 0, 255, 0);
    //imagefilledrectangle($test, 0, 0, 50, 50, $green);
    imagefilledellipse($test, 25, 25, 50, 50, $blue);
    //imagecolortransparent($test,$green);
    return $test;
}

$img=imagecreatetruecolor(200,200);

$img1 = detail1();
$img2 = detail1();

imagealphablending($img, false);
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $transparent);
imagesavealpha($img,true);
imagealphablending($img, true); //removing this causes the second layer's transparency to go trough the 1st layer erasing it (the image >is< transparent there ... as is the 2nd layer ... but not the 1st so it should not be transparent)

imagecopyresampled($img,$img1,10,10,0,0,imagesx($img1),imagesy($img1),imagesx($img1),imagesy($img1));
imagecopyresampled($img,$img2,110,110,0,0,imagesx($img2),imagesy($img2),imagesx($img2),imagesy($img2));

// Output our sample as a PNG
header('Content-type: image/png');
imagepng($img);

Das dabei entstandene Bild habe ich als Anhang hochgeladen. Wie man sehen kann, bleiben die "Ecken" der Kreisbilder schwarz. :(
 

Anhänge

  • test3.png
    test3.png
    872 Bytes · Aufrufe: 413
Die auskommentierte Transparenz ist ein vorheriger Versuch von mir. Wenn ich diese "einschalte", dann kann ich die Farbe der Ecken "transparent" machen, ja. Das funktioniert auch ohne den Code, den ich von deinem Link habe.
Leider wird dabei aber nicht das Bild transparent gemachrt, sondern lediglich diese eine Farbe, die eben mit imagecolortransparent angegeben wird. Ich habe aber einen "Hintergrund", der nicht immer die selbe Farbe hat und dann geht das Ganze wieder nicht.
Im Anhang wieder ein Bsp. Wenn ich dabei bei imagecolortranparent die Farbe rot einsetze, dann verschwinden die schwarzen Ecken auf der rechten Seite, wenn ich grün setze, dann die der linken Seite. Ich könnte jetzt wahrscheinlich mehrere Farben setzen, aber das löst mein Problem nicht. Denn es kann vorkommen, dass im "Hintergrund" ein komplexes Bild steht, dessen Farben ich nicht alle weiß.
 

Anhänge

  • test3.png
    test3.png
    1 KB · Aufrufe: 415
Also ich hab's jetzt rausgefunden. Wie ich mir schon dachte... recht simpel, man muss halt drauf kommen.
Für die Nachwelt:
PHP:
$test = imagecreatetruecolor($width, $height);
imagesavealpha($test, true);
imagefill($aufh_alu,0,0,imagecolorallocatealpha($test, 0, 0, 0, 127));

greez
 
Zurück
Oben