2012-08-16 3 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

Верхнее изображение является желе lyfish image, внизу - QR-код, который можно увидеть только тогда, когда изображение помещено на любой фон, отличный от белого. Так что я уверен, что это происходит, это то, что imagecolortransparent ($ imageOut, $ colourBlack); превращает каждый черный пиксель во вновь созданном файле merged_file.png для прозрачности. Я проверил теорию, изменяя imageCreateTransparent ($ х, $ у) слегка к тому, что будет показано ниже,

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

ответ

0

Вы пробовали устанавливать черные пиксели прозрачно только на верхнем изображении, а затем делать копию?

The PHP manual states: «Прозрачность копируется только с imagecopymerge() и истинными цветными изображениями, а не с изображениями imagecopy() или pallete».

Так может быть, что это альтернативное решение для применения прозрачности на конечное изображение перед копированием двух других в

Другое дело, что может быть стоит посмотреть на это:. imagealphablending. В комментариях к сайту php упоминалось, что неправильное задание может повлиять на слоирование изображений с применением альфа.