2012-08-16 85 views
3

對,所以我開始在PHP中構建一個函數,它可以將兩個圖像合併在一起,同時保留PNG文件的透明背景 - 我成功完成 - 使用下面的代碼,imagecolortransparent()將所有黑色像素變成透明的PHP

function imageCreateTransparent($x, $y) { 

    $imageOut = imagecreatetruecolor($x, $y); 
    $colourBlack = imagecolorallocate($imageOut, 0, 0, 0); 
    imagecolortransparent($imageOut, $colourBlack); 
    return $imageOut; 
} 



function mergePreregWthQR($preRegDir, $qrDir){ 

$top_file = $preRegDir; 
$bottom_file = $qrDir; 


$top = imagecreatefrompng($top_file); 
$bottom = imagecreatefrompng($bottom_file); 

// get current width/height 
list($top_width, $top_height) = getimagesize($top_file); 
list($bottom_width, $bottom_height) = getimagesize($bottom_file); 

// compute new width/height 
$new_width = ($top_width > $bottom_width) ? $top_width : $bottom_width; 
$new_height = $top_height + $bottom_height; 

// create new image and merge 
$new = imageCreateTransparent($new_width,$new_height); 
imagecopy($new, $bottom, 0, $top_height+1, 0, 0, $bottom_width, $bottom_height); 
imagecopy($new, $top, 0, 0, 0, 0, $top_width, $top_height); 

$filename = "merged_file.png"; 

// save to file 
imagepng($new, $filename); 

} 

mergePreregWthQR("file.png", "qr.png"); 

這設法合併兩個圖像,並保持透明的背景下,唯一的問題是,在合併後的圖像中的任何黑色像素變成透明的,這個合併的結果如下所示> merged image

頂部圖像是果皮下圖是QR碼,只有當圖像放置在除白色以外的任何背景上時才能看到。所以我很確定發生了什麼,是imagecolortransparent($ imageOut,$ colourBlack);黑色像素中新創建的merged_file.png設置爲透明。我通過改變imageCreateTransparent($ X,$ y)的輕微到什麼如下所示測試理論,

function imageCreateTransparent($x, $y) { 

$imageOut = imagecreatetruecolor($x, $y); 
$colourBlack = imagecolorallocate($imageOut, 55, 55, 55); 
imagefill ($imageOut, 0, 0, $colourBlack); 

imagecolortransparent($imageOut, $colourBlack); 

return $imageOut; 

}

所以在這個功能我用的顏色(55,55填充整個圖像,55),然後在我的imagecolortransparent()函數中將此顏色設置爲透明。這樣做的竅門,我的QR碼顯示爲它應該是。唯一的問題是,我認爲這是一個快速和骯髒的黑客,如果任何人有一個上傳的圖像中的顏色(55,55,55),它會變成透明的?所以我很想知道另一種解決方案是什麼?謝謝。

+0

你有沒有解決這個問題?我有同樣的問題... – GhostCode 2014-02-06 05:24:34

回答

0

您是否嘗試將黑色像素設置爲僅在頂部圖像上透明,然後進行復制?

The PHP manual states: 「只有使用imagecopymerge()和真彩色圖像才能複製透明度,不能使用imagecopy()或調色板圖像。

因此,它可能會認爲這是一種替代解決方案,以在複製兩個人之前將最終的圖像上的透明度

可能是值得考慮的是另一件事:imagealphablending。在php網站的評論中提到,如果這個設置不正確,可能會影響應用了alpha的圖像的分層。

相關問題