2010-12-14 12 views
9

Mam obraz (nazwijmy go: oryginalny obraz), na którym chcę umieścić znak wodny innego obrazu (nazwijmy go: logo).
logo to przezroczysty plik PNG, natomiast oryginalny obraz może być png, jpg lub gif.
Mam następujący kod:
Korzystając z GD w PHP, w jaki sposób mogę utworzyć przezroczysty znak wodny PNG na plikach PNG i GIF? (Pliki JPG działają bez zarzutu)

function watermarkImage($originalFileContents, $originalWidth, $originalHeight) { 
    $logoImage = imagecreatefrompng('logo.png'); 
    imagealphablending($logoImage, true); 

    $logoWidth = imagesx($logoImage); 
    $logoHeight = imagesy($logoImage); 

    $originalImage = imagecreatefromstring($originalFileContents); 

    $destX = $originalWidth - $logoWidth; 
    $destY = $originalHeight - $logoHeight; 

    imagecopy(
     // source 
     $originalImage, 
     // destination 
     $logoImage, 
     // destination x and y 
     $destX, $destY, 
     // source x and y 
     0, 0, 
     // width and height of the area of the source to copy 
     $logoWidth, $logoHeight 
    ); 
    imagepng($originalImage); 
} 

Ten kod działa dobrze (dobrze = zachować przejrzystość logo) tylko wtedy, gdy oryginalny obrazto plik JPG.
Gdy oryginalny plik
jest plikiem GIF lub PNG, logo ma białe tło, co oznacza, że ​​przezroczystość nie działa.

Dlaczego? Co muszę zmienić, żeby zadziałało?
Dzięki

UPDATE:
Oto moja recoded wersja:

function generate_watermarked_image($originalFileContents, $originalWidth, $originalHeight, $paddingFromBottomRight = 0) { 
    $watermarkFileLocation = 'watermark.png'; 
    $watermarkImage = imagecreatefrompng($watermarkFileLocation); 
    $watermarkWidth = imagesx($watermarkImage); 
    $watermarkHeight = imagesy($watermarkImage); 

    $originalImage = imagecreatefromstring($originalFileContents); 

    $destX = $originalWidth - $watermarkWidth - $paddingFromBottomRight; 
    $destY = $originalHeight - $watermarkHeight - $paddingFromBottomRight; 

    // creating a cut resource 
    $cut = imagecreatetruecolor($watermarkWidth, $watermarkHeight); 

    // copying that section of the background to the cut 
    imagecopy($cut, $originalImage, 0, 0, $destX, $destY, $watermarkWidth, $watermarkHeight); 

    // placing the watermark now 
    imagecopy($cut, $watermarkImage, 0, 0, 0, 0, $watermarkWidth, $watermarkHeight); 

    // merging both of the images 
    imagecopymerge($originalImage, $cut, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight, 100); 
} 
+0

To może być pomocne [PHP + GD: imagecopymerge nie zachowując PNG przezroczystości] (http://stackoverflow.com/questions/3355993/phpgd-imagecopymerge-not-retaining-png-transparencies/3356419#3356419). – Mike

+0

@doron Dzięki za przykładowy kod. – vee

Odpowiedz

6

imagecopy nie obsługuje za pomocą dwóch obrazów z kanałów alfa. spójrz na imagecopymerge.

http://php.net/manual/en/function.imagecopymerge.php

Jest wiele przykładów w użytkownikowi komentuje sekcje, a wykończone realizacja tego, co chcesz:

http://www.php.net/manual/en/function.imagecopymerge.php#92787

+0

Skończyłem implementację, do której się połączyłeś. Napisano go bardzo źle, ale po jego przekodowaniu działało to cudownie z około 5 liniami kodu. Dzięki – Doron

+0

@Doron możesz opublikować swoją recoded wersję? Byłby to dobry dodatek do mojej osobistej książki kucharskiej;) –

+0

@ Oliver-a Oczywiście, edytowałem moje oryginalne pytanie i dodałem do niego kod. – Doron

Powiązane problemy