2010-12-14 36 views
9

Tôi có một hình ảnh (hãy gọi nó là hình ảnh gốc) mà tôi muốn đóng dấu một hình ảnh khác (hãy gọi nó là logo).
Biểu trưng là PNG trong suốt, trong khi hình ảnh gốc có thể là png, jpg hoặc gif.
Tôi có đoạn mã sau:Sử dụng GD trong PHP, làm cách nào để tạo hình mờ PNG trong suốt trên các tệp PNG và GIF? (Các tệp JPG hoạt động tốt)

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); 
} 

Mã này hoạt động tốt (tốt = giữ tính minh bạch của Logo) chỉ khi ảnh gốc là một file JPG.
Khi tệp gốc là GIF hoặc PNG, biểu trưng có nền màu trắng liền, nghĩa là độ trong suốt không hoạt động.

Tại sao? Tôi cần thay đổi gì để nó hoạt động?
Cảm ơn

UPDATE:
Đây là phiên bản recoded tôi:

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

Điều này có thể giúp đỡ [PHP + GD: imagecopymerge không giữ PNG trong suốt] (http://stackoverflow.com/questions/3355993/phpgd-imagecopymerge-not-retaining-png-transparencies/3356419#3356419). – Mike

+0

@ doron Cảm ơn mã ví dụ. – vee

Trả lời

6

imagecopy không hỗ trợ sử dụng hai hình ảnh với các kênh alpha. hãy xem imagecopymerge.

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

Có rất nhiều ví dụ trong người dùng bình luận của các phần, và một thực hiện thành những gì bạn muốn:

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

+0

Việc triển khai đã hoàn thành mà bạn liên kết đã thực hiện thủ thuật. Nó được viết thực sự tồi tệ, nhưng sau khi recoding nó - nó làm việc tuyệt vời với khoảng 5 dòng mã. Cảm ơn – Doron

+0

@ Doron bạn có thể đăng phiên bản đã mã hóa của mình không? Nó sẽ là một bổ sung tốt cho sách dạy nấu ăn cá nhân của tôi;) –

+0

@ Oliver-a Chắc chắn, tôi đã chỉnh sửa câu hỏi ban đầu của mình và thêm mã vào đó. – Doron

Các vấn đề liên quan