Сочетание прозрачных PNG - PullRequest
1 голос
/ 05 марта 2012

Я искал здесь в SO решения для моей проблемы, но я не могу найти решение, которое, кажется, работает для меня. Может я что-то не так делаю.

Я объединяю несколько прозрачных PNG-изображений в один дисплей для клиента. Есть почти три слоя (очевидно, фон прозрачный, затем довольно прямоугольные PNG, но немного не квадратные, а затем более мелкие).

Верхний слой меньших изображений красиво идет по прямоугольникам. Но прямоугольники выглядят так, как если бы они были сначала закрашены черным, а затем применено изображение - вы можете видеть это, потому что изображение немного не квадратное, поэтому на краях обычно есть черная линия вокруг него. Я не понимаю, почему этот слой имеет его, а не верхний - оба изображения создаются с одним и тем же кодом.

Вот мой код (где-то я нашел функцию imagecopymerge_alpha, и, кажется, она работает довольно хорошо, но, очевидно, не совсем).

// Merging:

$this->imagecopymerge_alpha($this->image, $resizedImage, $startX, $startY, 0, 0, imagesx($resizedImage), imagesy($resizedImage), 100);

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ 
    // creating a cut resource 
    $cut = imagecreatetruecolor($src_w, $src_h); 

    // copying relevant section from background to the cut resource 
    imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); 

    // copying relevant section from watermark to the cut resource 
    imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); 

    // insert cut resource to destination image 
    imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct); 
}


// Creating the background/container image:

private function createTransparent($width, $height)
{
    $image = imagecreatetruecolor($width, $height);

    imagealphablending($image, false);
    imagesavealpha($image, true);       
    $transparentColor = imagecolorallocatealpha($image, 255, 255, 255, 127);
    imagefill($image, 0, 0, $transparentColor);

    return $image;
}

Итак, мой вопрос таков: видите ли вы здесь что-нибудь, что заставило бы прозрачный PNG не поддерживать свою прозрачность и правильно слиться с базовым прозрачным PNG?

...