0

GD2を使用して、透明なpngを無地で塗りつぶします。これが、私のコードと結果です。基本的に、透明度が始まるとすぐに、塗りつぶしの色は透明度に溶け込むのではなく、突然停止します。

private function GenerateImage()
{
    $original = imagecreatefrompng($this->ImagePath());

    $x = imagesx($original);
    $y = imagesy($original);

    $image = imagecreate($x,$y);

    imagealphablending($image,false);
    imagesavealpha($image,true);

    imagecopyresampled($image,$original,0,0,0,0,$x,$y,$x,$y);

    $colour = imagecolorallocate($image,$this->RGB[0],$this->RGB[1],$this->RGB[2]);
    imagefill($image,0,0,$colour);

    return imagepng($image,$this->GeneratedPath());

    imagedestroy($original);
    imagedestroy($image);
}

元の画像:

代替テキストhttp://far.id.au/jkf/so/blank.png

結果の画像:

代替テキストhttp://far.id.au/jkf/so/filled.png

4

1 に答える 1

3

間違った方向に進んでいると思います。透明な画像を色の上に表示しようとしている場合は、最初に塗りつぶしてから画像をコピーする必要があります。

また、透明度を使用している場合は、imagecreatetruecolor();を呼び出す必要があります。imagecreate();の代わりに

private function GenerateImage()
{
        $original = imagecreatefrompng($this->ImagePath());

        $x = imagesx($original);
        $y = imagesy($original);

        $image = imagecreatetruecolor($x,$y);

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

        $colour = imagecolorallocate($image,$this->RGB[0],$this->RGB[1],$this->RGB[2]);
        imagefill($image,0,0,$colour);

        imagecopyresampled($image,$original,0,0,0,0,$x,$y,$x,$y);

        return imagepng($image,$this->GeneratedPath());

        imagedestroy($original);
        imagedestroy($image);
}

画像の上に赤を描画しようとしている場合は、imagefill()の代わりにimagefilledrectangle()を使用してください。何らかの理由で、イメージフィルはOHPフィルムではうまく機能しないようです。

// Replace
imagefill($image,0,0,$colour);
// With
imagefilledrectangle( $image, 0,0, $x,$y,$colour);
于 2009-07-20T11:01:27.247 に答える