[PHP/GD] Witte achtergrond bij imagecopy()?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:07
De situatie
Ik probeer een uitsnede te maken van een grotere foto (croppen). Om deze uitsnede moet echter nog een rand van 2CM geplakt worden (oftewel aantalcentimeters+(2x2cm) voor de breedte en hetzelfde voor de hoogte). Als je uitsnede echter tegen de rand van de foto aanzit moet er dus een rand bijgeplakt worden van buiten de foto.

Het probleem
Het probleem is dus dat imagecreatetruecolor() een zwarte afbeelding aanmaakt, waarover ik het geselecteerde/gecropte gedeelte plak. Wanneer er echter een rand buiten de foto zit zie je hier de zwarte kleur van imagecreatetruecolor() als achtergrond. Dit moet dus wit zijn.

Wat ik heb geprobeerd
Ik kom er alleen niet uit hoe ik dit fix. Ik heb nu (heel sterk versimpeld) dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * $cmw = aantal pixels per centimeter breedte
 * $cmh = aantal pixels per centimeter hoogte
**/

// Lege afbeelding aanmaken (die zwart is) op het juiste formaat
$src = imagecreatefromjpeg(getcwd() . '/uploads' . $img);
$dest = imagecreatetruecolor($imgwidth + (4 * $cmw), $imgheight + (4 * $cmh));

// Witte kleur aanmaken en de destination afbeelding daarmee vullen (zwart wordt dus wit)
$white = imagecolorallocate($dest, 255, 255, 255);
imagefill($dest, 0, 0, $white);

// Uitsnede kopiëren naar lege afbeelding en hier een afbeelding van opslaan op de server
imagecopy($dest, $src, 0, 0, $x1 - (2 * $cmw), $y1 - (2 * $cmh), $imgwidth + (4 * $cmw), $imgheight + (4 * $cmh));
imagejpeg($dest, $newname, 100);


Het resultaat
Ik zou verwachten dat het zwarte gebied wordt overschreven door een witte kleur, zodat je een witte rand om afbeeldingen heen ziet. Dit is echter niet het geval. De rand om afbeeldingen heen blijft zwart zoals te zien is op onderstaande foto:

Afbeeldingslocatie: http://i53.tinypic.com/eqnfj6.jpg

Iemand enig idee waarom dit zo is :?

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 14-08 12:22

Wiethoofd

Broadcast TOM

Volgens mij moet je met imagecolorallocatealpha aan de slag ;)

Volg me op Twitter/X & Bluesky


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:07
Ah nice, ik zal het eens proberen :) Thanks!

Edit: nope, dat was het niet (tenzij ik het verkeerd gebruik). Ik heb in mijn voorbeeld imagecolorallocate() vervangen door imagecolorallocatealpha() met een alpha value van 0 en krijg nogsteeds een zwarte rand:

Afbeeldingslocatie: http://i54.tinypic.com/hvwcbl.jpg

[ Voor 30% gewijzigd door Avalaxy op 01-01-2011 16:56 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Allereerst:
Note:

The first call to imagecolorallocate() fills the background color in palette-based images - images created using imagecreate().
Die imagefill is dus niet nodig.

Verder is imagecopy volgens mij niet alphachannel-aware. Probeer imagecopyresampled eens.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:07
Ik gebruik nu imagecolorallocatealpha() met imagecopyresampled() zonder imagefill() en ik krijg nogsteeds een zwarte rand :?

Hier even een copy/pasta van hoe mijn code er nu uitziet en wat het resultaat is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$src = imagecreatefromjpeg(getcwd() . '/uploads' . $img);
if (!$dest = imagecreatetruecolor($imgwidth + (4 * $cmw), $imgheight + (4 * $cmh))) {
    self::$error = 'Kan geen lege afbeelding aanmaken.';
}
            
if (empty(self::$error)) {
    if (!$white = imagecolorallocatealpha($dest, 255, 255, 255, 0)) {
        self::$error = 'Kan geen kleur aanmaken.';
    }
}
            
if (empty(self::$error)) {
    if (!imagecopyresampled($dest, $src, (2 * $cmw), (2 * $cmh), $x1, $y1, $imgwidth, $imgheight, $imgwidth, $imgheight)) {
        self::$error = 'Afbeelding kon niet worden verwerkt.';
    }
}
            
if (empty(self::$error)) {
    if (!imagejpeg($dest, $newname, 100)) {
        self::$error = 'Afbeelding kon niet worden verwerkt.';
    }
}


Afbeeldingslocatie: http://i56.tinypic.com/n2kf2q.jpg

Werkt imagecolorallocatealpha() misschien niet met imagecreatetruecolor()? Moet kunnen, doen ze op php.net ook gewoon...

[ Voor 5% gewijzigd door Avalaxy op 01-01-2011 20:30 ]


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Misschien werkt flood fill wel niet omdat er nog geen kleur voor die pixels gespecificeerd is?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 
/** 
 * $cmw = aantal pixels per centimeter breedte 
 * $cmh = aantal pixels per centimeter hoogte 
**/ 

// Lege afbeelding aanmaken (die zwart is) op het juiste formaat 
$src = imagecreatefromjpeg(getcwd() . '/uploads' . $img); 
$dest = imagecreatetruecolor($imgwidth + (4 * $cmw), $imgheight + (4 * $cmh)); 

// Witte kleur aanmaken en de destination afbeelding daarmee vullen (zwart wordt dus wit) 
$white = imagecolorallocate($dest, 255, 255, 255); 

// >>> Rectangle ipv flood fill! <<<
imagefilledrectangle($dest, 0, 0, $imgwidth + (4 * $cmw), $imgheight + (4 * $cmh), $white);

// Uitsnede kopiëren naar lege afbeelding en hier een afbeelding van opslaan op de server 
imagecopy($dest, $src, 0, 0, $x1 - (2 * $cmw), $y1 - (2 * $cmh), $imgwidth + (4 * $cmw), $imgheight + (4 * $cmh)); 
imagejpeg($dest, $newname, 100); 
?>

[ Voor 2% gewijzigd door ReenL op 01-01-2011 20:38 . Reden: Comment ]


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:07
ReenL schreef op zaterdag 01 januari 2011 @ 20:37:
Misschien werkt flood fill wel niet omdat er nog geen kleur voor die pixels gespecificeerd is?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 
/** 
 * $cmw = aantal pixels per centimeter breedte 
 * $cmh = aantal pixels per centimeter hoogte 
**/ 

// Lege afbeelding aanmaken (die zwart is) op het juiste formaat 
$src = imagecreatefromjpeg(getcwd() . '/uploads' . $img); 
$dest = imagecreatetruecolor($imgwidth + (4 * $cmw), $imgheight + (4 * $cmh)); 

// Witte kleur aanmaken en de destination afbeelding daarmee vullen (zwart wordt dus wit) 
$white = imagecolorallocate($dest, 255, 255, 255); 

// >>> Rectangle ipv flood fill! <<<
imagefilledrectangle($dest, 0, 0, $imgwidth + (4 * $cmw), $imgheight + (4 * $cmh), $white);

// Uitsnede kopiëren naar lege afbeelding en hier een afbeelding van opslaan op de server 
imagecopy($dest, $src, 0, 0, $x1 - (2 * $cmw), $y1 - (2 * $cmh), $imgwidth + (4 * $cmw), $imgheight + (4 * $cmh)); 
imagejpeg($dest, $newname, 100); 
?>
Oeh tasty. Met imagefilledrectangle kan ik idd een wit vlak maken en de afbeelding erop plakken, dus hij doet nu precies wat ik wil _/-\o_

Thanks allen :)
Pagina: 1