2009-06-22 9 views
3

Ich benutze GD, um die Größe zu ändern und Bilder zu konvertieren, aber während meiner Tests fand ich ein seltsames Verhalten beim Konvertieren von transparenten PNGs zu JPEGs. Nach dem Handbuch ImageAlphaBlending() ist standardmäßig eingeschaltet, aber um die Transparenz zu erhalten, muss ich ImageSaveAlpha() auf True setzen (was wiederum erfordert, dass ich ImageAlphaBlending() auf false gesetzt). So sollte der richtige Weg sein:PHP/GD ImageSaveAlpha und ImageAlphaBlending

$result = ImageCreateFromPNG(...); 
ImageAlphaBlending($result, false); 
ImageSaveAlpha($result, true); 
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
ImageJPEG($result); 
ImageDestroy($result); 

Allerdings, wenn ich es tun die „richtige“ Art und Weise die ganze Transparenz Bereich im JPEG schwarz aufkommt. Dies scheint auf meinen Tests (mit weißen Hintergrund auf transparenten Bereichen JPEG) zu arbeiten:

$result = ImageCreateFromPNG(...); 
ImageAlphaBlending($result, true); // true by default, but still... 
ImageSaveAlpha($result, true); 
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
ImageJPEG($result); 
ImageDestroy($result); 

Kann jemand zu diesem Thema aufklären mich bitte?

+0

Entschuldigung! Afaik-Bilder im JPEG-Format können keinen "transparenten" Hintergrund oder einen Alpha-Kanal haben. – merkuro

+0

Ja, das weiß ich. Ich möchte nur, dass der gesamte transparente Bereich des ursprünglichen PNG-Bildes bei der JPEG-Ausgabe in Weiß konvertiert wird. Entschuldigung, wenn ich mich nicht gut genug erkläre. –

Antwort

6

Es hängt wahrscheinlich von Ihrem PNG ab. Eine PNG-Datei kann eine Hintergrundfarbe enthalten, die verwendet werden kann, wenn die Transparenz nicht funktioniert. Ihr PNG hat wahrscheinlich einen weißen Hintergrund. Wenn Sie imageaplshierdning auf "true" setzen, wird die Hintergrundfarbe von Ihrem PNG übernommen und beim Schreiben der JPEG-Datei verwendet. Wenn Sie es auf false setzen, wählt es den Standard für GD, das schwarz ist.

Sie können es für sich selbst versuchen. Erstellen Sie ein transparentes PNG und speichern Sie es mit einer orangefarbenen oder rosa Hintergrundfarbe. Ihr zweites Beispiel sollte diese Farbe zeigen.

Übrigens ist die PNG Hintergrundfarbe Trick eine nette für IE6 Bilder. IE6 unterstützt keine transparenten PNGs, daher werden sie mit der Hintergrundfarbe angezeigt, mit der Sie sie gespeichert haben. Wenn Sie transparente PNGs speichern, speichern Sie sie mit derselben Hintergrundfarbe wie Ihre Website. Es wird besser aussehen als weiße oder schwarze Kästchen um Ihre PNG-Bilder in IE6.

3

Wenn Sie von PNG konvertieren (oder GIF) in JPG-Dateien, sollten Sie wahrscheinlich das endgültige Bild auf ein anderes Bild kopieren, das mit weißen gefüllt ist, mit imagecopy ($image jedes Bild ist bereits mit GD erstellt):

// Create a new background 
$bg = imagecreatetruecolor(imagesx($image), imagesy($image)); 

// Allocate the color 
$color = imagecolorallocate($bg, 255, 255, 255); 

// Fill the background with white 
imagefill($bg, 0, 0, $color); 

// Alpha blending must be enabled on the background! 
imagealphablending($bg, TRUE); 

// Copy the current image onto the opaque background 
if (imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image))) 
{ 
    // Replace the image with the background copy 
    imagedestroy($image); 
    $image = $bg; 
} 

Hoffe, dass hilft.

+0

Kommentieren des Imagealpblending ($ bg, TRUE); line gibt mir genau das gleiche Ergebnis, nichtsdestotrotz ist das ziemlich viel was ich mit der IMG_COLOR_TRANSPARENT Konstante mache. Mein Hauptbezweifelt hier ist die gleichzeitige Verwendung von ImageAlphaBlending und ImageSaveAlpha, beide auf True gesetzt. Nur so bekomme ich korrekte Ergebnisse, aber das Handbuch sagt, dass es falsch ist und dass beide nicht gleichzeitig wahr sein können. –

+0

Nicht sicher, was Ihr Code dann tut, aber der obige Code funktionierte für mich. – shadowhand

Verwandte Themen