Черный фон в ограничительной рамке, созданный при повороте изображения с помощью PHP

Я прошерстил Интернет в поисках ответа на этот вопрос, но не могу найти что-то, что работает. Когда я поворачиваю изображение, скажем, на 5 градусов, это изображение поворачивается внутри граничного изображения, созданного для размещения поворота. Это созданное изображение полностью черное.

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

<?PHP
$png = imagecreatefrompng('polaroids/polaroid0002.png');

// Do required operations
$png = imagerotate($png, 354.793, 0, 0);

// Turn off alpha blending and set alpha flag
imagealphablending($png, false);
imagesavealpha($png, true);

// Output image to browser
header('Content-Type: image/png');

imagepng($png);
imagedestroy($png);
?>

Однако это дает следующее:

урожайность

Что я могу сделать, чтобы черная ограничивающая рамка была прозрачной?

Спасибо!


person Pablo Canseco    schedule 21.05.2012    source источник


Ответы (3)


Просто установите прозрачный цвет imagecolorallocatealpha($png, 0, 0, 0, 127) для цвета фона.

<?php
$png = imagecreatefrompng('polaroids/polaroid0002.png');

// Do required operations
$png = imagerotate($png, 354.793, imagecolorallocatealpha($png, 0, 0, 0, 127), 0);

// Turn off alpha blending and set alpha flag
imagealphablending($png, false);
imagesavealpha($png, true);

// Output image to browser
header('Content-Type: image/png');

imagepng($png);
imagedestroy($png);
?>
person Musa    schedule 21.05.2012

Не уверен, я не знаком с использованием этой конкретной функции PHP. Тем не менее, большинство разработчиков предпочитают напрямую использовать ImageMagick или GD для обработки изображений с помощью PHP. Функция, которую вы используете, похоже, является функцией GD. Я бы начал искать здесь. Возможно, вам придется немного изменить ресурс изображения, чтобы установить прозрачность или другой цвет.

http://php.net/manual/en/book.image.php

http://php.net/manual/en/book.imagick.php

Я рекомендую посмотреть это: http://php.net/manual/en/function.imagecolortransparent.php

person Patrick    schedule 21.05.2012
comment
Этот скрипт использует GD. Я не видел никаких руководств, использующих ImageMagick. - person Pablo Canseco; 22.05.2012
comment
Да, извините, я поторопился и изменил ответ секунду назад. - person Patrick; 22.05.2012
comment
Пробовал добавить это: $black = imagecolorallocate($png, 0, 0, 0); imagecolortransparent($png, $black); перед частью заголовка, и ничего не изменилось. - person Pablo Canseco; 22.05.2012

Вот код, который РАБОТАЕТ (выкопал его из моих трехлетних архивов). Я использовал его, чтобы объединить 2 изображения png и отобразить текст, сохраняя при этом прозрачность. Он создает новое изображение, устанавливает цвет прозрачности, затем копирует в него изображения. Этот точный файл работал в моей реализации (цвета, однако, я составил прямо сейчас, потому что тогда я извлекал их из базы данных, поэтому я не помню, что они были и что они означали). Извините, если сумбурно. Результирующее изображение $image состоит из $ruler_img в качестве первого слоя, $index_img в качестве второго слоя и текста в качестве третьего слоя. У вас есть только один слой в вашем случае.

        //prepare first layer
        $ruler_img=$ruler_img=imagecreatefrompng($_SERVER['DOCUMENT_ROOT'].$ruler['out_ruler_img']);
        //create main image, basic layer, background
        $image = imageCreateTrueColor($ruler_width, $ruler_height);
        imageSaveAlpha($image, true);
        $transparentColor = imagecolorallocatealpha($image, 0,0,0, 127); //some color used as transparency key, this uses black
        $color = imagecolorallocatealpha($image, 0,0,0,127);
        //fill with transparent color
        imagefill($image, 0, 0, $transparentColor);

        imagealphablending($ruler_img,true);
        //copy the first layer
        imagecopy($image,$ruler_img,0,0,0,0,$ruler_width,$ruler_height);

        //prepare the second layer 
        $index_img=imagecreatefrompng($_SERVER['DOCUMENT_ROOT'].$ruler['out_index_img']);
        $size=getimagesize($_SERVER['DOCUMENT_ROOT'].$ruler['out_index_img']);
        $index_width=$size[0];
        $index_height=$size[1];

        imagealphablending($index_img,true);

        $ratio=1.0;
        if($index_height>$ruler_height)
            $ratio=$ruler_height*1.0/$index_height;
        $new_width=$index_width*$ratio;
        $new_height=$index_height*$ratio;

        //now I copy the resampled second layer 
        imagecopyresampled(
            $image,
            $index_img,
            $position*($ruler_width-$new_width),
            ($ruler_height-$new_height)/2,
            0,
            0,
            $new_width,
            $new_height,
            $index_width,
            $index_height);
        //render text   
        $font = "fonts/comic.ttf";
        $fontSize=10;
        $box=imagettfbbox($fontSize, 0, $font,$text);
        $textWidth=$box[2]-$box[6];
        $textHeight=$box[3]-$box[7];

        imagettftext($image, $fontSize, 0, $ruler_width-$textWidth-10, $ruler_height+12, $color, $font, $text);
        header("Content-type: image/png");
        //that's it!
        imagepng($image);
person AlexanderMP    schedule 21.05.2012
comment
Очень интересная реализация. Попытка это. - person Pablo Canseco; 22.05.2012
comment
Я решил пойти с более простым решением, опубликованным выше. Спасибо хоть. - person Pablo Canseco; 22.05.2012