0

私はコードのスニペットを持っています、

そのアイデアは、定義された高さ/幅に透明なキャンバスを作成することです。そのため、そこにjpg/png/gifのいずれかを配置できます。

ただし、透過性のある PNG を配置する場合は、透過性を保持する必要があります。

これはコードのサンプルです

    header("Content-type: image/png");

    $canvas = imagecreatetruecolor($maxWidth, $maxHeight);
    $image = $_GET['file'];
    $leftOffset = ($maxWidth / 2) - ($width / 2);
    $topOffset = ($maxHeight / 2) - ($height / 2);
    $quality    = (isset($_GET['quality'])) ? (int) ceil($_GET['quality'] / 10) : ceil($DEFAULT_QUALITY / 10);

    $quality = $quality == 10 ? 9 : $quality; 

    switch($mime){
        case "image/jpeg":
            $image = imagecreatefromjpeg($image);
            $red = imagecolorallocate($canvas, 0, 255, 0);
            imagecolortransparent($canvas, $red);
            imagefill($canvas, 0, 0 ,$red);
        break;
        case "image/gif":
            $image = imagecreatefromgif($image);
        break;
        case "image/png":
            $background = imagecolorallocate($canvas, 255, 0, 0);
            imagecolortransparent($canvas, $background);
            imagealphablending($canvas, false);
            imagesavealpha($canvas, true); 
            $image = imagecreatefrompng($image);
        break;
    }

    imagecopyresampled($canvas, $image, $leftOffset, $topOffset, 0, 0, $width, $height, $width, $width);
    imagepng($canvas, null, $quality);
    imagedestroy($canvas);

ただし、問題は、キャンバスが黒のままで、画像の周りのボックス領域が透明であることです。

下の画像はこれを示しています。ライム グリーンの色が本体 {background:lime;} であるため、透明な領域を見ることができます。

ここに画像の説明を入力

imagecreatetruecolor の後に透明色を使ってみた

$red = imagecolorallocate($canvas, 255, 0, 0);
imagecolortransparent($canvas, $red);
imagefill($canvas, 0, 0 ,$red);

.png にフェード効果がある場合、色が正確に 255, 0, 0 ではない、その周りに厄介な赤いグローが発生します。

助言がありますか?

ありがとう

4

1 に答える 1

1

これはあなたのために働くはずです!

<?
$image = "your_image.png";

$image_info = getimagesize($image);
$width = $image_info[0];
$height = $image_info[1];
$mime_type = $image_info["mime"];
$maxWidth = 250;
$maxHeight = 250;
$quality = 9;

header("Content-type: $mime_type");

$canvas = imagecreatetruecolor($maxWidth, $maxHeight);
imagealphablending($canvas, false);
$background = imagecolorallocatealpha($canvas, 255, 255, 255, 127);
imagefilledrectangle($canvas, 0, 0, $maxWidth, $maxHeight, $background);
imagealphablending($canvas, true);

$leftOffset = ($maxWidth / 2) - ($width / 2);
$topOffset = ($maxHeight / 2) - ($height / 2);

switch($mime_type)
{
    case "image/jpeg":
        //JPG code
        break;
    case "image/gif":
        //GIF code
        break;
    case "image/png":
        $new_image = imagecreatefrompng($image);
        imagecopyresampled($canvas, $new_image, $leftOffset, $topOffset, 0, 0, $width, $height, $width, $height);
        imagealphablending($canvas, true);        
        imagesavealpha($canvas, true);
        imagepng($canvas, null, $quality);
        imagedestroy($canvas);        
        break;
}
?>
于 2013-07-27T16:33:08.130 に答える