Transparenz fuer mehrere Palettenwerte vom Ausgangsbild.

Hallo.

Ich moechte aus einem Ausschnitt von einem GIF ein neues Bild erstellen
bei dem einige Palettenfarben des Ausgangsbild zu guter letzt
Transparent sind. Mein bisheriger Loesungsansatz:


<?php

// Lade Originalbild

$img1 = imagecreatefromgif('050.gif');

// Erstelle neues Bild

$img = imagecreate(398,398);

// Kopiere benoetigten Ausschnitt ins neue Bild

imagecopyresized($img, $img1, 0,0, 51,51, 398,398, 398,398);

// Ersetze RGB-Farben durch eine Farbe

$ZuErsetzendeFarbe = imagecolorexact($img, 239, 239, 239);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 215, 215, 215);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 191, 191, 191);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 167, 167, 167);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 143, 143, 143);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 120, 120, 120);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 96, 96, 96);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 72, 72, 72);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 254, 254, 254);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);
$ZuErsetzendeFarbe = imagecolorexact($img, 0, 0, 0);
imagecolorset($img, $ZuErsetzendeFarbe, 255, 255, 255);

// Wähle Transparente Farbe

$trans = imagecolorexact($img, 255, 255, 255);
ImageColorTransparent($img, $trans);

// Speicher neues Bild ab

imagegif($img, 'test.gif');

?>

Leider wird aber immer nur die letzte Farbe die ich in RGB 255,255,255
aendere, in diesem Fall also RGB 0,0,0 ,transparent. Wie schaffe ich es
denn das zu guter letzt alles was zuletzt den RGB-Farbwert 255,255,255
hat transparent wird?

MfG

Paul
Paul Zysk [ Mo, 31 März 2008 18:37 ] [ ID #1931850 ]

Habe das Problem doch selber loesen koennen

Nach dem ich nun den halben Tag lang verzweifelt herumexperimentiert
habe kam ich jetzt doch noch zu einer Loesung!

Ich habe den Code


$trans = imagecolorexact($img, 255, 255, 255);
ImageColorTransparent($img, $trans);


entfernt und das Bild aus dem bisherigen Code erst als tmp.gif
gespeichert. Dieses GIF wurde das erneut bearbeitet:


// Lade Temporaeres Bild aus ersten Teil

$img1 = imagecreatefromgif('tmp.gif');

// Erstelle ein neues Bild in Truecolor

$img = imagecreatetruecolor(398,398);

// Lege die Transparente Farbe fest

$trans = imagecolorallocate($img,255,255,255);
imagecolortransparent($img,$trans);

// Kopiere das Ursprungsbild in das neue Bild

imagecopy($img,$img1,0,0,0,0,398,398);

// Das neue Bild in 256-Farben aendern

imagetruecolortopalette($img, true, 256);

// Speichere neues Bild
imagegif($img,'test.gif');


So sind im neuen Bild alle Paletteneinträge die ich im ersten Schritt in
RGB 255,255,255 geaendert habe transparent.

MfG
Paul
Paul Zysk [ Mo, 31 März 2008 19:56 ] [ ID #1931859 ]

Re: Transparenz fuer mehrere Palettenwerte vom Ausgangsbild.

Paul Zysk schrieb:

> Ich moechte aus einem Ausschnitt von einem GIF ein neues Bild erstellen
> bei dem einige Palettenfarben des Ausgangsbild zu guter letzt
> Transparent sind. Mein bisheriger Loesungsansatz:

Ein GIF kann immer nur _einen_ transparenten Paletteneintrag haben. Wenn
das Ergebnis wieder ein GIF sein soll, musst Du also alle Farben, die
transparent werden sollen, durch den gleichen Paletteneintrag ersetzen.
Es genügt _nicht_, die Paletteneinträge auf die gleiche Farbe zu setzen.

Die Alternative heißt PNG.

Gruß. Claus
Claus Reibenstein [ Mo, 31 März 2008 20:18 ] [ ID #1931864 ]

Re: Transparenz fuer mehrere Palettenwerte vom Ausgangsbild.

Claus Reibenstein schrieb:

> Ein GIF kann immer nur _einen_ transparenten Paletteneintrag haben.

So, wie ich den Source verstanden habe, werden verschiedene Farbwerte auf
die Farbe 255,255,255 gesetzt und anschließend 255,255,255 auf transparent
desetzt. In sofern ist es kein Problem, dass GIF nur eine transparente
Farbe kennt; genau dies wird in dem Algorithmus gewürdigt.

Es muss einen logischen Fehler für das genannte Phänomen geben, den ich
mangels Erfahrnung mit Grafikverarbeitung in PHP allerdings nicht erkennen
kann. Für mich klingt das Konzept schlüssig. Ich hätte die Aufgabe
vermutlich auf sehr ähnliche Weise zu lösen versucht.

Falls nicht schon geschehen, hilft es vielleicht ein paar Beispiele aus dem
Web zu studieren: http://de.php.net/manual/de/function.imagecolorset.php

Martin
Martin Lemke [ Di, 01 April 2008 08:18 ] [ ID #1933157 ]

Re: Transparenz fuer mehrere Palettenwerte vom Ausgangsbild.

Imagecolorset ändert nur die Farbe von einem einzelnen Palettenplatz.

Beispiel:

Bild mit einer Palette bestehend aus
1.) rot
2.) grün
3.) blau

nach

imagecolorset(rot, weiß);
imagecolorset(grün, weiß);

sehen zwar alle roten und grünen Pixel jetzt weiß aus, die roten haben
aber das Weiß aus Platz 1.) und die grünen aus Platz 2.)

imagecolorexact(weiß) liefert jetzt entweder Platz 1.) oder Platz 2.)
und imagecolortransparent( ) setzt eben nur den zurückgegebenen Platz
auf transparent.
so [ Di, 01 April 2008 13:08 ] [ ID #1933164 ]

Re: Habe das Problem doch selber loesen koennen

Paul Zysk wrote:
> Nach dem ich nun den halben Tag lang verzweifelt herumexperimentiert
> habe kam ich jetzt doch noch zu einer Loesung!
>
> Ich habe den Code
>
>
> $trans = imagecolorexact($img, 255, 255, 255);
> ImageColorTransparent($img, $trans);
>
>
> entfernt und das Bild aus dem bisherigen Code erst als tmp.gif
> gespeichert. Dieses GIF wurde das erneut bearbeitet:

Ohne es ausprobiert zu haben, vieleicht geht das auch ohne
Zwischenspeichern:

$tmpImg = $imagecreatetruecolor(398,398);
imagecopy($tmpImg, $img, 0, 0, 0, 0, 398, 398);
imagetruecolortopalette ($tmpImg, false, 256);

imagegif($tmpImg ...);
so [ Di, 01 April 2008 13:13 ] [ ID #1933165 ]

Re: Transparenz fuer mehrere Palettenwerte vom Ausgangsbild.

Martin Lemke schrieb:

> Claus Reibenstein schrieb:
>
>> Ein GIF kann immer nur _einen_ transparenten Paletteneintrag haben.
>
> So, wie ich den Source verstanden habe, werden verschiedene Farbwerte auf
> die Farbe 255,255,255 gesetzt und anschließend 255,255,255 auf transparent
> desetzt. In sofern ist es kein Problem, dass GIF nur eine transparente
> Farbe kennt; genau dies wird in dem Algorithmus gewürdigt.

Du hast den Source vielleicht verstanden, aber nicht das, was ich dazu
geschrieben habe. Lies es noch einmal, diesmal aber ganz.

Gruß. Claus
Claus Reibenstein [ Di, 01 April 2008 21:59 ] [ ID #1933193 ]
PHP » de.comp.lang.php.misc » Transparenz fuer mehrere Palettenwerte vom Ausgangsbild.

Vorheriges Thema: Funktionen aus Datei einbinden
Nächstes Thema: Re: SoapClient: Array als Wert