PHP слить JPEG поверх PNG с альфа-прозрачностью - PullRequest
3 голосов
/ 23 марта 2012

Я пытаюсь поместить JPEG позади PNG - где PNG имеет альфа-прозрачность.

Изображение на переднем плане здесь: http://peugeot208.srv.good -morning.no / images / marker-shadow.png

Изображение позади - изображение профиля в Facebook - обычноthis: https://graph.facebook.com/100000515495823/picture

Полученное изображение теряет прозрачность и вместо него становится черным: http://peugeot208.srv.good -morning.no / library / cache / test.png

Этокод, который я использую:

// combine image with shadow
$newCanvas = imagecreatetruecolor(90,135);
$shadow = imagecreatefrompng("marker-shadow.png");  

//imagealphablending($newCanvas, false);
imagesavealpha($newCanvas, true);   

imagecopy($newCanvas, $canvas, 20, 23, 0, 0, 50, 50);
imagecopy($newCanvas, $shadow, 0, 0, 0, 0, 90, 135);
imagepng($newCanvas, $tempfile, floor($quality * 0.09));

Если я включаю imagealphablending ($ newCanvas, false); результат будет правильным (с прозрачным отверстием в середине маркера), НО изображение позади исчезнет.

Можете ли вы пролить свет на это?:-)

Спасибо!

Редактировать: Нашел решение

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

Теперь все работает - результат правильно прозрачен.Я действительно не знаю почему.Есть идеи почему?

fbimage.php

// Create markerIcon 
$src = $_REQUEST['fbid'];

$base_image = imagecreatefrompng("../images/marker-template.png");
$photo = imagecreatefromjpeg("https://graph.facebook.com/".$src."/picture");
$top_image = imagecreatefrompng("../images/marker-shadow.png");

imagesavealpha($base_image, true);
imagealphablending($base_image, true);

imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);
imagepng($base_image, "./cache/".$src.".png");

?>

<img src="./cache/<?php echo $src ?>.png" />

Обновление: проверьте следующий код Результат можно найти здесь: http://peugeot208.srv.good -morning.no/images/marker.php Как видите, фон все еще черный.

// create base image
$base_image = imagecreatetruecolor(90,135);
$photo = imagecreatefromjpeg("marker-original.jpg");
$top_image = imagecreatefrompng("marker-shadow.png");

imagesavealpha($top_image, true);
imagealphablending($top_image, true);

imagesavealpha($base_image, true);
imagealphablending($base_image, true);

// merge images
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);

// return file
header('Content-Type: image/png');
imagepng($base_image);

Ответы [ 5 ]

5 голосов
/ 27 марта 2012

Решением было выделить цвет как 100% альфа-прозрачный, а затем нарисовать квадрат на всем холсте базового изображения:

// create base image
$base_image = imagecreatetruecolor(90,135);

// make $base_image transparent
imagealphablending($base_image, false);
$col=imagecolorallocatealpha($base_image,255,255,255,127);
imagefilledrectangle($base_image,0,0,90,135,$col);
imagealphablending($base_image,true);    
imagesavealpha($base_image, true);
// --- 

$photo = imagecreatefromjpeg("marker-original.jpg");
$top_image = imagecreatefrompng("marker-shadow.png");

// merge images
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);

// return file
header('Content-Type: image/png');
imagepng($base_image);
1 голос
/ 24 марта 2012

Запустите следующий php-скрипт и посмотрите, какой https погоды доступен для этого набора массивов.


    echo "<pre>";
    print_r(stream_get_wrappers());
    echo "
";

out будет выглядеть следующим образом.


    Array
    (
        [0] => php
        [1] => file
        [2] => glob
        [3] => data
        [4] => http
        [5] => ftp
        [6] => zip
        [7] => compress.zlib
        [8] => https
        [9] => ftps
        [10] => compress.bzip2
        [11] => phar
    )

здесь элемент массиваВосьмое показывает, что https включен. Если это не доступно в вашем коде, найдите файл php.ini и поместите там следующую строку.

extension = php_openssl.dll

Послепри перезапуске серверов ваша функция будет работать даже с URL-адресом ресурса facebook.

0 голосов
/ 26 марта 2013
// create base image
$photo = imagecreatefromjpeg("Penguins.jpg");
$frame = imagecreatefrompng("frame.png");

// get frame dimentions
$frame_width = imagesx($frame);
$frame_height = imagesy($frame);

// get photo dimentions
$photo_width = imagesx($photo);
$photo_height = imagesy($photo);

// creating canvas of the same dimentions as of frame
$canvas = imagecreatetruecolor($frame_width,$frame_height);

// make $canvas transparent
imagealphablending($canvas, false);
$col=imagecolorallocatealpha($canvas,255,255,255,127);
imagefilledrectangle($canvas,0,0,$frame_width,$frame_height,$col);
imagealphablending($canvas,true);    
imagesavealpha($canvas, true);

// merge photo with frame and paste on canvas
imagecopyresized($canvas, $photo, 0, 0, 0, 0, $frame_width, $frame_height,$photo_width, $photo_height); // resize photo to fit in frame
imagecopy($canvas, $frame, 0, 0, 0, 0, $frame_width, $frame_height);

// return file
header('Content-Type: image/png');
imagepng($canvas);

// destroy images to free alocated memory
imagedestroy($photo);
imagedestroy($frame);
imagedestroy($canvas);
0 голосов
/ 31 октября 2012

Некоторое время боролся с этим, и ни один из ответов здесь не помог мне полностью.Ниже приведен код, который отлично работал при попытке залить JPG поверх прозрачного PNG (обратите внимание на комментарии "// !!! *", они важны):

// create a true colour, transparent image
// turn blending OFF and draw a background rectangle in our transparent colour 
$image=imagecreatetruecolor($iwidth,$iheight);
imagealphablending($image,false);
$col=imagecolorallocatealpha($image,255,255,255,127);

imagefilledrectangle($image,0,0,$iwidth,$iheight,$col);
imagealphablending($image,true);
// ^^ Alpha blanding is back on.

// !!! *** IMAGE MANIPULATION STUFF BELOW ***

$backImage = imagecreatefrompng("yourimage.png");
imagecopyresampled($image, $backImage, 0, 0, 0, 0, 400, 300, 400, 300);
$foreImage = imagecreatefromjpeg("yourimage.png");
imagecopyresampled($image, $foreImage, 10, 10, 0, 0, 200, 150, 200, 150);

// !!! *** IMAGE MANIPULATION STUFF ABOVE ***

// output the results... 
header("Content-Type: image/png;");
imagealphablending($image,false);
imagesavealpha($image,true);
imagepng($image);

Кредиты: http://www.bl0g.co.uk/creating-transparent-png-images-in-gd.html

0 голосов
/ 23 марта 2012

Я пробую следующий код, он мне подходит.


    $width = 400;
    $height = 400;

    $base_image = imagecreatefromjpeg("base.jpg");
    $top_image = imagecreatefrompng("top.png");

    imagesavealpha($top_image, false);
    imagealphablending($top_image, false);
    imagecopy($base_image, $top_image, 0, 0, 0, 0, $width, $height);
    imagepng($base_image, "merged.png");


Я проверяю первый скриптДля всех прозрачных PNG вы должны применить следующий код.

imagesavealpha ($ shadow, true);imagealphablending ($ shadow, true);

в противном случае будет присутствовать черная заливка.Здесь вы не применили это для объекта файла marker-shadow.png

...