[php] 2 PNG's (met transparantie) samenvoegen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Archiebald
  • Registratie: Juni 2006
  • Laatst online: 03-09 02:09
Ik ben bezig voor een project om een foto upload systeem te maken, en het geheel is opzich werkend.
De gebruiker upload een foto/plaatje bij het systeem, deze wordt dan vervolgens 2x verkleint (thumbnail en versie voor de website). Origineel wordt bewaard, maar niets opgeplaatst qua watermerk. Op zowel de thumbnail als de versie voor de website moet een watermerk met transparante rand op komen te staan.
Het plaatsen van het watermerk op die locatie werkt. Echter zit ik met een probleem wat betreft transparantie bij plaatjes die zelf ook transparant zijn.

Ik heb op internet gezocht, en kwam op de volgende dingen uit:
http://mediumexposure.com...rency-php-and-gd-library/
Hier werd het watermerk transparant, echter ook de achtergrond van het watermerk. Zeg maar

http://php.net/manual/en/function.imagecopymerge.php#52900
Aangezien er in het watermerk geen rood zit, heb ik rood gepakt ipv wit, maar daar haalt hij maar een hoekje weg. En vervangt het rode voor zwart terwijl het transparant moet zijn.

http://nl2.php.net/imagecolortransparent#85678
Hier is het watermerk goed qua transparantie, echter is het geüploade plaatje niet transparant. Maar is het transparante van het geüploade plaatje juist zwart.

Deze code heb ik nu, en geeft het watermerk de transparantie van het hele plaatje (zoals hierboven). Ipv dat hij het watermerk erop zet, zet hij het in de plaats van het achtergrond. Zo lijkt het.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Breedte & hoogte berekenen, voor resize
$size = calc_size($source_width, $source_height, 420, 315); 

// verkleining aanmaken
$new_tmp = imagecreatetruecolor($size['width'], $size['height']); 

// uiteindelijke plaatje aanmaken
$new = imagecreatetruecolor($size['width'], $size['height']); 

//watermark creator
$watermark = imagecreatefrompng("/var/www/static/picdb_watermark.png");

//als uploadfoto een PNG is
if($type == 3)
{
  //transparantie overnemen
  $background = imagecolorallocate($new_tmp, 0, 0, 0);
  imagecolortransparent($new_tmp,$background);
  imagealphablending($new_tmp,false);
  imagesavealpha($new_tmp,true);
  
  imagealphablending($new, false);
  imagesavealpha($new, true);
}
// Verkleinen
imagecopyresampled($new_tmp, $source, 0, 0, 0, 0, $size['width'], $size['height'], $source_width, $source_height);

//samenvoegen
imagecopy($new, $new_tmp, 0, 0, 0, 0, $size['width'], $size['height']); 
imagecopy($new, $watermark, 5, 5, 0, 0, 60, 59); 
?>


Ik ben ten einde raad, en ben hier al de hele ochtend mee bezig. Iemand tips of wellicht een eventuele oplossing?

Acties:
  • 0 Henk 'm!

Verwijderd

Het is een tijd geleden dat ik met GD gewerkt heb, maar je kunt toch ook met echte transarantie werken (alpha channel), in plaats van één kleur naar transparant to te mappen?
Je zit namelijk nogal ingewikkeld te doen door een kleur naar transparant om te zetten, over te gooien naar alpha zonder blending, dan plaatjes kopieeren naar een ander plaatje, waar wel alpha is, maar niet die ene kleur als transparant gemerkt is, etc.

Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Wat roadrunner zegt...
imagecolorallocatealpha is de manier...

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:11
Ik zit ook altijd te prutsen met GD en transparante plaatjes. Er zijn veel te veel mogelijke manieren en semi-gerelateerde functies die allemaal slecht met elkaar samenwerken, waardoor je altijd zit te prutsen om het goed werkend te krijgen.

Vandaar dat ik, als het enigszins mogelijk is, liever ImageMagick gebruik. Het geval dat je noemt (een plaatje resizen en van een watermerk voorzien, met behoud van transparantie) gaat in ImageMagick heel eenvoudig met één commando:
convert origineel.png -resize 800x600 watermerk.png -composite uitvoer.png 

[ Voor 18% gewijzigd door Soultaker op 03-12-2010 22:12 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Soultaker schreef op vrijdag 03 december 2010 @ 22:11:
Ik zit ook altijd te prutsen met GD en transparante plaatjes. Er zijn veel te veel mogelijke manieren en semi-gerelateerde functies die allemaal slecht met elkaar samenwerken, waardoor je altijd zit te prutsen om het goed werkend te krijgen.

Vandaar dat ik, als het enigszins mogelijk is, liever ImageMagick gebruik. Het geval dat je noemt (een plaatje resizen en van een watermerk voorzien, met behoud van transparantie) gaat in ImageMagick heel eenvoudig met één commando:
convert origineel.png -resize 800x600 watermerk.png -composite uitvoer.png 
Waarom zou je dat via de commandline doen als je op zo'n beetje elke host die ImageMagick aanbiedt ook de IMagick-class tot je beschikking hebt? :P

'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!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
in php:
imagealphablending($watermerk,true);

Na: imagecreatefrompng

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:11
NMe schreef op vrijdag 03 december 2010 @ 22:47:
Waarom zou je dat via de commandline doen als je op zo'n beetje elke host die ImageMagick aanbiedt ook de IMagick-class tot je beschikking hebt? :P
Kan ook. Alles is beter dan de halfbakken alpha channel support die achteraf in GD gehackt is. ImageMagick doet dit (in ieder geval op de command line) vanzelf goed. Ik heb zelf die IMagick class eigenlijk nooit gebruikt; ik kan me voorstellen dat die weer meer handmatig codewerk meebrengt, dan simpelweg system() callen.

Het voordeel van de command line interface is juist dat die heel high level is, en dat je tussendoor niet hoeft te controleren op fouten (het enige wat je wil weten is of de hele operatie slaagt of niet). De API lijkt me vooral nuttig als je plaatjes niet op wil slaan tussendoor.

[ Voor 19% gewijzigd door Soultaker op 03-12-2010 23:56 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Soultaker schreef op vrijdag 03 december 2010 @ 23:54:
[...]

Kan ook. Alles is beter dan de halfbakken alpha channel support die achteraf in GD gehackt is. ImageMagick doet dit (in ieder geval op de command line) vanzelf goed. Ik heb zelf die IMagick class eigenlijk nooit gebruikt; ik kan me voorstellen dat die weer meer handmatig codewerk meebrengt, dan simpelweg system() callen.
Klopt, maar het is meteen ook een stukje leesbaarder.
Het voordeel van de command line interface is juist dat die heel high level is, en dat je tussendoor niet hoeft te controleren op fouten (het enige wat je wil weten is of de hele operatie slaagt of niet).
Discutabel IMO, maar laten we die discussie maar niet aangaan in dit topic. :P

'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!

  • Archiebald
  • Registratie: Juni 2006
  • Laatst online: 03-09 02:09
RoadRunner84 en Mike2k, bedankt!
Ik heb het aangepast en het werkt nu goed.
Zelf heb ik vrijwel nooit met GD gewerkt, dus ik heb weer iets geleerd nu :)

Voor degene die dit topic lezen en zelfde vraag/probleem hebben, oplossing van mij:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
// Breedte & hoogte berekenen, voor resize 
        $size = calc_size($source_width, $source_height, $width, $height);  
        
        // verkleining aanmaken 
        $new_tmp = imagecreatetruecolor($size['width'], $size['height']);  
        
        // uiteindelijke plaatje aanmaken 
        $new = imagecreatetruecolor($size['width'], $size['height']);  
        
        //watermark creator 
        $watermark = imagecreatefrompng("/var/www/static/picdb_watermark.png"); 
          
        //als uploadfoto een PNG is 
        if($ext == 3) 
        { 
          //transparantie overnemen 
          $background = imagecolorallocatealpha($new_tmp, 0, 0, 0, 127); 
          imagefill($new_tmp, 0, 0, $background);
          imagefill($new, 0, 0, $background);
        } 

        // Verkleinen 
        imagecopyresampled($new_tmp, $pic, 0, 0, 0, 0, $size['width'], $size['height'], $source_width, $source_height); 
        
        //samenvoegen 
        imagecopy($new, $new_tmp, 0, 0, 0, 0, $size['width'], $size['height']);  
        
        imagecopy($new, $watermark, 5, 5, 0, 0, 60, 59);  
?>
Pagina: 1