2009-04-30 76 views

回答

1

這是一個骯髒的黑客我剛纔做了一個項目。它將灰度圖像作爲透明度圖映射到另一圖像(黑色透明,白色不透明,將地圖縮放爲圖像比例得到支持)。你可以創建一個合適的圓角透明圖(包括抗鋸齒,哇!)。

它很慢,因爲它是純粹的PHP,但我總是緩存結果。

$ image和$ transparencyMap是gd圖像資源,所以你必須自己imagecreatefromxyz。

<?php 
function applyTransparencyMap($image, $transparencyMap) { 
    if (!function_exists('extractrgb')) { 
     function extractrgb($rgb) { 
      $a = ($rgb >> 24) & 0xFF; 
      $r = ($rgb >> 16) & 0xFF; 
      $g = ($rgb >> 8) & 0xFF; 
      $b = $rgb & 0xFF; 
      return array($r, $g, $b, $a); 
     } 
    } 

    $sx = imagesx($image); 
    $sy = imagesy($image); 
    $tx = imagesx($transparencyMap); 
    $ty = imagesy($transparencyMap); 
    $dx = $tx/$sx; 
    $dy = $ty/$sy; 

    $dimg = imagecreatetransparent(imagesx($image), imagesy($image)); 

    for ($y = 0; $y<imagesy($image); $y++) { 
     for ($x = 0; $x<imagesx($image); $x++) { 
      $intcolor    = imagecolorat($image, $x, $y); 
      $intalpha    = imagecolorat($transparencyMap, floor($x*$dx), floor($y*$dy-1)); 
      list($tr, $tg, $tb, $ta) = extractrgb($intalpha); 
      $alphaval    = 127-floor(($tr+$tg+$tb)/6); 
      list($r, $g, $b, $a)  = extractrgb($intcolor); 
      $targetAlpha    = max(0, min(127,$alphaval+$a)); 
      $sct      = imagecolorallocatealpha($image, $r, $g, $b, $targetAlpha); 
      imagesetpixel($dimg, $x, $y, $sct); 
     } 
    } 

    return $dimg; 
} 
?> 

另一方面,更好地使用wideimage,因爲apikot建議。做同樣的更多。