Маскирование одного изображения против другого с помощью PHP GD

Посмотрите на этот вопрос: PHP GD Используйте одно изображение для маскировки другого изображения, включая прозрачность. В приведенных здесь правилах говорится, что пользователи создают новые вопросы, а не пересматривают старые и просят поддержки

Я работал с этим скриптом, чтобы включить прозрачную маскировку – (возможная) разница в том, что исходное изображение имеет прозрачность, но похоже, что код ниже работает только в том случае, если входные PNG не имеют прозрачности. Может кто-то посмотреть и посмотреть, что я делаю что-то неправильно?

То, что я пытаюсь сделать ниже: 1. Возьмите изображение с исходным кодом. 2. Измените его размер и сохраните его локально как pjg.png, поддерживая прозрачность (это работает нормально). 3. Зарисуйте полученное изображение другим PNG.

Информация:

  • image.png имеет прозрачность.
  • mask1.png – белый овал на черном фоне, без прозрачности
  • Изображение, сохраненное в самом конце, черное на нем, когда оно должно поддерживать прозрачность во всем.

    <?php $data = file_get_contents('assets/img/image.png'); $source = imagecreatefromstring( $data); // Set the percentage resize $percent = 0.5; // Get new dimensions list($width, $height) = getimagesize('assets/img/image.png'); $new_width = $width * $percent; $new_height = $height * $percent; $image_p = imagecreatetruecolor($new_width, $new_height); imagealphablending($image_p, false); imagesavealpha( $image_p, true ); imagecopyresampled($image_p, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagepng($image_p, "assets/img/pjg.png"); $mask_id = 1; create_mask( $image_p, $mask_id ); function create_mask( &$picture, $mask_id) { // Image masking using PHP // https://stackoverflow.com/questions/7203160/php-gd-use-one-image-to-mask-another-image-including-transparency $mask = imagecreatefrompng( 'assets/img/masks/mask'.$mask_id.'.png' ); // The mask is a white-on-black png // Get sizes and set up new picture $xSize = imagesx( $picture ); $ySize = imagesy( $picture ); $newPicture = imagecreatetruecolor( $xSize, $ySize ); imagesavealpha($newPicture, true); imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) ); // Resize mask if necessary if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) { $tempPic = imagecreatetruecolor( $xSize, $ySize ); imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) ); imagedestroy( $mask ); $mask = $tempPic; } // Perform pixel-based alpha map application for( $x = 0; $x < $xSize; $x++ ) { for( $y = 0; $y < $ySize; $y++ ) { $alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) ); $alpha = 127 - floor( $alpha[ 'red' ] / 2 ); $color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) ); imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) ); } } $salt = random_string('alnum', 8); // Another function generating a string, not important $now = time(); $new_filename = $now."_".$salt .".png"; // Save it Locally using a unique name imagepng($newPicture, "assets/img/uploads/cropped/".$new_filename); // Copy back to original picture imagedestroy( $picture ); $picture = $newPicture; } 

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

Благодаря!

PJG

Solutions Collecting From Web of "Маскирование одного изображения против другого с помощью PHP GD"

Я справился с этим. Исходный скрипт не проверял прозрачность исходного изображения. Следующий скрипт проверяет исходное изображение для прозрачности пикселей и действует соответствующим образом. В приведенном ниже скрипте формируется маска шага на изображении PNG и поддерживается прозрачность исходного изображения.

 <?php $data = file_get_contents('assets/img/image.png'); $source = imagecreatefromstring( $data); // Set the percentage resize $percent = 0.5; // Get new dimensions list($width, $height) = getimagesize('assets/img/image.png'); $new_width = $width * $percent; $new_height = $height * $percent; $image_p = imagecreatetruecolor($new_width, $new_height); imagealphablending($image_p, false); imagesavealpha( $image_p, true ); imagecopyresampled($image_p, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagepng($image_p, "assets/img/pjg.png"); $mask_id = 1; create_mask( $image_p, $mask_id ); function create_mask( &$picture, $mask_id) { // Image masking using PHP // http://stackoverflow.com/questions/7203160/php-gd-use-one-image-to-mask-another-image-including-transparency $mask = imagecreatefrompng( 'assets/img/masks/mask'.$mask_id.'.png' ); // The mask is a white-on-black png // Get sizes and set up new picture $xSize = imagesx( $picture ); $ySize = imagesy( $picture ); $newPicture = imagecreatetruecolor( $xSize, $ySize ); imagesavealpha($newPicture, true); imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) ); // Resize mask if necessary if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) { $tempPic = imagecreatetruecolor( $xSize, $ySize ); imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) ); imagedestroy( $mask ); $mask = $tempPic; } // Perform pixel-based alpha map application for( $x = 0; $x < $xSize; $x++ ) { for( $y = 0; $y < $ySize; $y++ ) { $alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) ); if(($alpha['red'] == 0) && ($alpha['green'] == 0) && ($alpha['blue'] == 0) && ($alpha['alpha'] == 0)) { // It's a black part of the mask imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) ); // Stick a black, but totally transparent, pixel in. } else { // Check the alpha state of the corresponding pixel of the image we're dealing with. $alphaSource = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) ); if(($alphaSource['alpha'] == 127)) { imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) ); // Stick a black, but totally transparent, pixel in. } else { $color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) ); imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $color['alpha'] ) ); // Stick the pixel from the source image in } } } } $salt = random_string('alnum', 8); // Another function generating a string, not important $now = time(); $new_filename = $now."_".$salt .".png"; // Save it Locally using a unique name imagepng($newPicture, "assets/img/uploads/cropped/".$new_filename); // Copy back to original picture imagedestroy( $picture ); $picture = $newPicture; } ?> 

Приветствия для чтения – похоже, я буду покупать себе пиво позже 🙂

PG