2012-07-27 13 views
5

Ich weiß, dass dies PLENTY von Zeiten bedeckt ist, aber ich versuche verschiedene Skripte und die Änderung, die ich habe, und ich immer noch kann nicht meine PNG-24 watermark.png zu sein transparent über die Oberseite meines Elternbildes.PHP - Wasserzeichen PNG Transparenz/Alpha

Das ist, was ich habe zur Zeit:

<? 

header('content-type: image/jpeg'); 

$watermark = imagecreatefrompng('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 

$image = imagecreatefromjpeg($imageURL); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$size = getimagesize($imageURL); 

imagealphablending($image, false); 
imagesavealpha($image, true); 

$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 

imagejpeg($image); 

imagedestroy($image); 
imagedestroy($watermark); 

?> 

Ich habe gerade gelesen eine andere Frage SO und eine der Antworten darauf hingewiesen, dass es nicht transparent sein, wenn Sie diese beiden Zeilen nicht hinzufügen:

imagealphablending($image, false); 
imagesavealpha($image, true); 

Ich habe sie hinzugefügt und immer noch nicht. Ich habe versucht, Header und Ausgabe auf PNG statt aber immer noch kein Glück. Ich habe das Wasserzeichen in meinen Browser geladen (roh) und es ist definitiv transparent, aber nicht auf dem Bild. Sicherlich kann das nicht so schwierig sein? Irgendwelche Ideen, was ich falsch mache?

Antwort

14

Es ist kein Problem mit dem Anwendungscode, es ist mit dem Wasserzeichenbild (PNG) selbst.

Viele Wasserzeichen Beispiele/Tutorials sagen, ein PNG-24 Wasserzeichen zu verwenden, aber nach einem Blog habe ich gerade gelesen, dass imagecopymerge nicht mit PNG-24-Dateien sehr gut umgehen, daher verwenden Sie PNG -8 und einige spezielle "Save for Web" -Einstellungen. Ich habe das gemacht und es funktioniert jetzt gut.

Hier ist der relevante Abschnitt über PNG-Typen von this blog:

  • PNG-8 (empfohlen)
    Farben:

    Das Wasserzeichen Bild in einem der folgenden empfohlenen Formate sein sollte : 256 oder weniger
    Transparenz: Ein/Aus

  • GIF
    Farben: 256 oder weniger
    Transparenz: Ein/Aus
  • JPEG
    Farben: True Color
    Transparenz: n/a

Die imagecopymerge Funktion nicht richtig die PNG-24 Griff Bilder; es wird daher nicht empfohlen.

Wenn Sie Adobe Photoshop verwenden Bilder als Wasserzeichen zu erstellen, ist es empfohlen, dass Sie Befehl mit den folgenden Einstellungen „für Web speichern“ verwenden:

File Format: PNG-8, non-interlaced 
Color Reduction: Selective, 256 colors 
Dithering: Diffusion, 88% 
Transparency: On, Matte: None 
Transparency Dither: Diffusion Transparency Dither, 100% 

Und für Leistungen des anderen , das ist der Wasserzeichen-Code, den ich habe, der funktioniert:

<? 
$masterURL = 'mydomain.com/myImage.jpg'; 

header('content-type: image/jpeg'); 
$watermark = imagecreatefrompng('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$image = imagecreatefromjpeg($masterURL); 
$size = getimagesize($masterURL); 
$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 
imagejpeg($image); 
imagedestroy($image); 
imagedestroy($watermark); 
?> 

Nach ein bisschen mehr re ading (this comment auf den gleichen Artikel), fand ich heraus, dass Sie PNG-24 Wasserzeichen aber mit imagecopy anstelle von imagecopymerge verwenden können.Sie können diese Zeile:

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 

mit dieser:

imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); 

Mit imagecopymerge mit PNG-8-Wasserzeichen ist ziemlich gut für 'on-the-fly' Watermarking, da die Wasserzeichen-Datei ist winzig . Wenn Sie "hinter den Kulissen" mit Wasserzeichen versehen, spielt die Dateigröße keine Rolle, und Sie können mit dem PNG-24-Wasserzeichen eine wesentlich bessere Qualität erzielen, wenn Sie imagecopy verwenden.

Ich hoffe, das hilft den verwirrten Wasserzeichen dort draußen.

+1

Bitte keine Screenshots des Textes einfügen. – meagar

+2

@meagar: Warum? Wenn es Sie so sehr stört, schreiben Sie es um! – TheCarver

+5

Ich tat, aber ich hätte nicht müssen. Text nicht screenshot. Es ist schlecht für das Web, schlecht für die Website und schlecht für seine Benutzer. – meagar