2012-07-02 3 views
2

다른 불투명 한 PNG 위에 부분적으로 투명한 PNG를 레이어하려고합니다.PHP에서 투명 이미지 병합

이 사이트와 그물에서이 작업을 수행하는 방법에 대한 많은 예가 있지만 모든 버전에서 전경 이미지의 투명도를 유지할 수없는 것처럼 보입니다.

는 현재 코드는 다음과 같습니다 : 흰색 (또는 검은 색)으로 투명 부분과 전경 이미지로 구성된 이미지를 생성

$image = imagecreatefrompng($_GET['fg']); 
$frame = imagecreatefrompng($_GET['bg']); 

imagealphablending($frame,true); 
imagecopymerge($image, $frame, 0, 0, 0, 0, 0, 100, 100); 

# Save the image to a file 
$output_file = 'preview-' . time() . '.png'; 

imagepng($image, $_SERVER['DOCUMENT_ROOT'] . '/share/' . $output_file); 

합니다. 내가하려고하는 일이 부족하고 누군가가 되거 수 있다면 감사하겠습니다

$canvas= imagecreatefrompng($_GET['bg']); 

$overlay_gd_image = imagecreatefrompng($_GET['fg']); 
$overlay_width = imagesx($overlay_gd_image); 
$overlay_height = imagesy($overlay_gd_image); 
imagealphablending($canvas, true); 
imagecopy($canvas, $overlay_gd_image, 0, 0, 0, 0, $overlay_width, $overlay_height); 
imagealphablending($canvas, false); 
imagesavealpha($canvas , true); 

imagepng($canvas, 'new.png'); 

: 같은 출력을 생성 이미지 썸네일 생성기, TimThumb에서 볼 수 있듯이

또한 나는이 시도했다 문제.

답변

1

네이티브 imagecopolymerge은 투명 이미지의 경우 실제로 그렇게 잘 작동하지 않습니다. 두 개의 PNG를 병합하고 알파 채널이 엉망이 아닌 경우 manual page에있는이 기능은 내게 매력적으로 작용하며 실제로 투명도를 유지합니다. 나는 PNG를 논스톱으로이 기능과 합병하여 문제가 없기 때문에 문제를 해결할 수 있다고 생각합니다. 당신이 예를 사용하는 경우 ("의 Gmail 닷컴에서 로드리고 도트 폴로"에 의해 게시 됨, 그/그녀. 너무 모든 학점)

<?php 
/** 
* PNG ALPHA CHANNEL SUPPORT for imagecopymerge(); 
* This is a function like imagecopymerge but it handle alpha channel well!!! 
**/ 

// A fix to get a function like imagecopymerge WITH ALPHA SUPPORT 
// Main script by aiden dot mail at freemail dot hu 
// Transformed to imagecopymerge_alpha() by rodrigo dot polo at gmail dot com 
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ 
    if(!isset($pct)){ 
     return false; 
    } 
    $pct /= 100; 
    // Get image width and height 
    $w = imagesx($src_im); 
    $h = imagesy($src_im); 
    // Turn alpha blending off 
    imagealphablending($src_im, false); 
    // Find the most opaque pixel in the image (the one with the smallest alpha value) 
    $minalpha = 127; 
    for($x = 0; $x < $w; $x++) 
    for($y = 0; $y < $h; $y++){ 
     $alpha = (imagecolorat($src_im, $x, $y) >> 24) & 0xFF; 
     if($alpha < $minalpha){ 
      $minalpha = $alpha; 
     } 
    } 
    //loop through image pixels and modify alpha for each 
    for($x = 0; $x < $w; $x++){ 
     for($y = 0; $y < $h; $y++){ 
      //get current alpha value (represents the TANSPARENCY!) 
      $colorxy = imagecolorat($src_im, $x, $y); 
      $alpha = ($colorxy >> 24) & 0xFF; 
      //calculate new alpha 
      if($minalpha !== 127){ 
       $alpha = 127 + 127 * $pct * ($alpha - 127)/(127 - $minalpha); 
      } else { 
       $alpha += 127 * $pct; 
      } 
      //get the color index with new alpha 
      $alphacolorxy = imagecolorallocatealpha($src_im, ($colorxy >> 16) & 0xFF, ($colorxy >> 8) & 0xFF, $colorxy & 0xFF, $alpha); 
      //set pixel with the new color + opacity 
      if(!imagesetpixel($src_im, $x, $y, $alphacolorxy)){ 
       return false; 
      } 
     } 
    } 
    // The image copy 
    imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h); 
} 

// USAGE EXAMPLE: 
$img_a = imagecreatefrompng('image1.png'); 
$img_b = imagecreatefrompng('wm2.png'); 

// SAME COMMANDS: 
imagecopymerge_alpha($img_a, $img_b, 10, 10, 0, 0, imagesx($img_b), imagesy($img_b),50); 

// OUTPUT IMAGE: 
header("Content-Type: image/png"); 
imagesavealpha($img_a, true); 
imagepng($img_a, NULL); 
?> 

, 당신은 $의 img_a 대신 $의 img_b 아래에있을 것입니다 볼 수 있습니다 이상한 블랙 박스를 가지고 있으면 $ img_b의 투명성이 유지 될 것입니다.

0

나는 똑같은 문제가있었습니다. 나를위한 해결책은 imagecopolymer 대신 imagecopyresampled를 사용하는 것이 었습니다. 이렇게하면 두 이미지의 투명도가 유지됩니다.

전달할 약간 다른 매개 변수를 알고 있어야합니다.