PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Monday, October 10, 2022

[FIXED] Why transparent background doesn't work with GD?

 October 10, 2022     gd, php     No comments   

Issue

I'm creating image with PHP library GD:

$image = imagecreatefrompng('http://polariton.ad-l.ink/8rRSf4CpN/thumb.png');
$w = imagesx($image);
$h = imagesy($image);

$border = imagecreatefrompng('https://www.w3schools.com/css/border.png');

// New border width

$x1 = $w;
$x2 = 28;
$x3 = (int)($x1 / $x2);
$x4 = $x1 - $x3 * $x2;
$x5 = $x4 / $x3;
$x2 = $x2 + $x5;

$bw = $x2;

// New border height

$y1 = $h;
$y2 = 28;
$y3 = (int)($y1 / $y2);
$y4 = $y1 - $y3 * $y2;
$y5 = $y4 / $y3;
$y2 = $y2 + $y5;

$bh = $y2;

// New image width and height

$newWidth = (int)$w * (1 - ((($bw * 100) / (int)$w) / 100 * 2));
$newHeight = (int)$h * (1 - ((($bh * 100) / (int)$h) / 100 * 2));

// Transparent border

$indent = imagecreatetruecolor($w, $h);
$color = imagecolorallocatealpha($indent, 0, 0, 0, 127);
imagefill($indent, 0, 0, $color);

imagecopyresampled($indent, $image, $bw, $bw, 0, 0, $newWidth, $newHeight, $w, $h);

// Vertical border

$verticalX = 0;
$verticalY = $bh;

while ($verticalY < $h - $bh) {
    // Left
    imagecopy($indent, $border, $verticalX, $verticalY, 0, 27, $bh, $bh);

    // Right
    imagecopy($indent, $border, $w - $bw, $verticalY, 0, 27, $bh, $bh);

    $verticalY += $bh;
}

// Horizontal border

$horizontalX = $bw;
$horizontalY = 0;

while ($horizontalX < $w - $bw) {
    // Top
    imagecopy($indent, $border, $horizontalX, $horizontalY, 0, 27, $bw, $bw);

    // Bottom
    imagecopy($indent, $border, $horizontalX, $h - $bh, 0, 27, $bw, $bw);

    $horizontalX += $bw;
}

// Left top border
imagecopy($indent, $border, 0, 0, 0, 0, $bw, $bh);

// Right top border
imagecopy($indent, $border, $w - $bw, 0, 0, 0, $bw, $bh);

// Right bottom border
imagecopy($indent, $border, $w - $bw, $h - $bh, 0, 0, $bw, $bh);

// Left bottom border
imagecopy($indent, $border, 0, $h - $bh, 0, 0, $bw, $bh);


// Save result

header('Content-Type: image/png');
imagepng($indent);

But transparency does't work: enter image description here

Idk why, I do everything as written in the documentation.

What could be the problem?


Solution

JPEG files don't support transparency.

You can try a different format, for example PNG.

You'll need to make a small change to your code to enable the output to maintain alpha-channel transparency by calling imagesavealpha just after you create your new image resource:

...
$indent = imagecreatetruecolor($w, $h);
imagesavealpha($indent, true);
...

And then change your last two lines:

header('Content-Type: image/png');
imagepng($indent);


Answered By - timclutton
Answer Checked By - Robin (PHPFixing Admin)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing