[PHP/GD] Alternatief voor imagecolorallocatealpha?

Pagina: 1
Acties:
  • 196 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Topicstarter
Ik wil voor mijn avatarscript dat het aantal keer dat de avatar geviewd is erop weergeven. Ik heb dat helemaal werkend gekregen op mijn eigen servertje, maar op mijn remote server werkt het niet, omdat daar een oudere versie van PHP draait, namelijk 4.2.x. Het blijkt dat imagecolorallocatealpha een versie hoger dan 4.3.2 wil zien. Nou vroeg ik me af of er een alternatief is om een transparant blokje met daarop tekst te tekenen m.b.v. PHP/GD. Ik heb wat zitten kloten met imagealphablending(), maar daar kwam niet veel soeps uit.

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
  $background = imagecreatetruecolor($width, $height); 
  switch ($mimeType) { 
    case "image/jpeg": $foreground = imagecreatefromjpeg($folder.$image); break;
    case "image/png":  $foreground = imagecreatefrompng ($folder.$image); break;
    case "image/gif":  $foreground = imagecreatefromgif ($folder.$image); break;
    case "image/vnd.wap.wbmp": $foreground = imagecreatefromwbmp ($folder.$image); break;
  } 

  imagecopyresampled($background, $foreground, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]); 

  if (function_exists("imagecolorallocatealpha")) {
    $link = mysql_connect("host", "user", "pass");
    $DB = mysql_select_db("database", $link);
  
    mysql_query("UPDATE avatar_view SET views = views + 1");
    $aantal = mysql_result(mysql_query("SELECT views FROM avatar_view LIMIT 0,1"), 0);
    
    $aantal = putCommas($aantal);
  
    for ($i = 0; $i < $blockheight; $i++) {
      $color = ImageColorAllocateAlpha($background, 255, 255, 255, $i * ceil(127 / $blockheight - 1));
      ImageLine($background, 0, $height - $i, $width - 1, $height - $i, $color);
    }
  
    $green = ImageColorAllocate($background, 0, 48, 0);
    $offset = ($width - (imagefontwidth(1) * strlen($aantal))) / 2;
  
    imagestring($background, 1, $offset, $height - ($blockheight - 2), $aantal, $green);
  }
                                                                     
  imagepng($background);

Dit is het stuk code dat mijn blokje weergeeft. Misschien dat iemand weet hoe het anders kan, zonder imagecolorallocatealpha?

[ Voor 41% gewijzigd door NMe op 05-06-2004 15:21 . Reden: Code aangepast op overloopeffect ]

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

  • Cartman!
  • Registratie: April 2000
  • Niet online
daar hoef je helemaal geen blokje op te maken oid, gewoon imagestring werkt toch prima?

Zo heb ik t bij mijn icon ook gedaan hier links te zien.....

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
header("Content-type: image/png"); // png
$icon = ImageCreate(60, 60); // plaatje wordt 60x60

$icon = imagecreatefrompng("blaat.png"); // laad plaatje in

$wit = ImageColorAllocate($icon, 255, 255, 255); // wit

$string = "blaat"; // maak je string
imagestring($icon, 2, 3, 2, $string, $wit); // zet de tekst erop

ImagePNG($icon);
ImageDestroy($icon);

[ Voor 79% gewijzigd door Cartman! op 04-06-2004 12:25 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Topicstarter
Mijn icon is variabel, wat betekent dat er de ene keer een zwart plaatje kan staan, en de andere keer een wit. Daarom teken ik eerst een transparant blokje waar ik donkergroen op kan tekenen, wat mooier uitziet imho. :) Trouwens, het blokje waar die tekst op komt is is het geval van mijn GoT icon maar 14 pixels hoog, dus dat gaat wel. :)

Overigens heb ik eens gekeken naar ImageMagick, maar ik kan niet uitvogelen of dat ook kan doen wat ik wil. Het wordt iig wel ondersteund door de server.

Ik hoop dat ik hier uit kom, ik wil toch liever dat mijn script werkt zonder dat ik moet wachten tot mijn host eens besluit te upgraden... :X

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

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maar leg uit dan : een transparant blokje...als ie transparant is, wat heeft t voor zin?
Of bedoel je een soort blend methode zoals add oid?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Topicstarter
g00fy schreef op 05 juni 2004 @ 00:18:
Maar leg uit dan : een transparant blokje...als ie transparant is, wat heeft t voor zin?
Of bedoel je een soort blend methode zoals add oid?
Dit is de bedoeling:
Afbeeldingslocatie: http://217.121.96.76/avatars/avatar.php?folder=avatars(werkt alleen als mijn pc aan staat :P ). De teller die ik erin zet is maar tijdelijk, uiteindelijk komt daar wel zinnige tekst in. Maar eerst eens zien dat ik het werkend krijg op mijn webserver. :(


edit:
Ik heb mijn startpost aangepast op de code die ik nu heb, zodat er een overloopeffect is in plaats van een duidelijk zichtbaar blokje. :)

[ Voor 17% gewijzigd door NMe op 05-06-2004 15:25 ]

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

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

NMe

Quia Ego Sic Dico.

Topicstarter
Is er niemand die me kan helpen? Het enige alternatief dat ik kan bedenken en wat misschien zou kunnen werken lijk me een beetje overkill, namelijk iedere pixel apart afgaan, naar de huidige kleurwaarde kijken en daar iets "bij optellen" of "aftrekken". Maar óf en hóe dat geïmplemeenteerd zou kunnen worden...? En verder lijkt het me geen goed idee om zoiets met GD te doen...

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

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-08 20:27
NMe84 schreef op 06 juni 2004 @ 00:46:
Is er niemand die me kan helpen? Het enige alternatief dat ik kan bedenken en wat misschien zou kunnen werken lijk me een beetje overkill, namelijk iedere pixel apart afgaan, naar de huidige kleurwaarde kijken en daar iets "bij optellen" of "aftrekken". Maar óf en hóe dat geïmplemeenteerd zou kunnen worden...? En verder lijkt het me geen goed idee om zoiets met GD te doen...
Het gaat maar om een klein blokje, van 15x10 pixels zo te zien?

Kun je niet een functie schrijven die cijfers kan tekenen? Dus dat je een cijfer pixel voor pixel over je Gandalf-plaatje heen zet.
edit:
Nu staat er een hondje...

[ Voor 5% gewijzigd door Skaah op 06-06-2004 11:37 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Topicstarter
Dat kan in principe wel, maar ten eerste moet ik dan de bitpatronen van alle letters en cijfers gaan inprogrammeren, omdat er ook letters op moeten kunnen, en verder wil ik dat balkje graag gebruiken omdat ik dat wel leuk uit vind zien... Maja na 2 dagen klooien denk ik er wel achter te zijn dat dat niet gaat lukken. ;(

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

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-08 20:27
NMe84 schreef op 06 juni 2004 @ 12:53:
Dat kan in principe wel, maar ten eerste moet ik dan de bitpatronen van alle letters en cijfers gaan inprogrammeren, omdat er ook letters op moeten kunnen, en verder wil ik dat balkje graag gebruiken omdat ik dat wel leuk uit vind zien... Maja na 2 dagen klooien denk ik er wel achter te zijn dat dat niet gaat lukken. ;(
Euhm, misschien kun je (nog een andere methode)... een imageresource maken, daar de tekst inzetten (witte achergrond / zwarte tekst) en dan met imagecopymerge de imageresource over je bronafbeelding zetten?

Als je de laatste parameter van imagecopymerge op ongeveer 15 à 18 zet hou je hde kleuringen van de originele foto. Ik heb op mijn computer op mijn kamer nog wel een stukje code staan, als je me na het weekend mailt kan ik het hier wel ff voor je posten.

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
of toch met imagesetpixel gaan werken....

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Topicstarter
Skaah schreef op 06 juni 2004 @ 13:34:
Euhm, misschien kun je (nog een andere methode)... een imageresource maken, daar de tekst inzetten (witte achergrond / zwarte tekst) en dan met imagecopymerge de imageresource over je bronafbeelding zetten?

Als je de laatste parameter van imagecopymerge op ongeveer 15 à 18 zet hou je hde kleuringen van de originele foto. Ik heb op mijn computer op mijn kamer nog wel een stukje code staan, als je me na het weekend mailt kan ik het hier wel ff voor je posten.
Hmm, ik zie je post nu pas, was helemaal vergeten dat dit topic nog niet opgelost was. :+ Ik hoef vooralsnog geen code te zien, ik denk dat ik met de wetenschap dat de functie bestaat al een heel eind ga komen. Tnx! :)

* NMe gaat er ff mee spelen. :)

Als ik klaar ben post ik de uiteindelijke oplossing wel ff. :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!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-08 20:27
NMe84 schreef op 09 juni 2004 @ 12:03:
[...]

Hmm, ik zie je post nu pas, was helemaal vergeten dat dit topic nog niet opgelost was. :+
Och, och en ik mij maar uitsloven... :P

[ Voor 40% gewijzigd door Skaah op 09-06-2004 15:30 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Topicstarter
Skaah schreef op 09 juni 2004 @ 15:30:
Och, och en ik mij maar uitsloven... :P
* NMe aait Skaah

Het lukt toch niet helemaal, zoals je hier kan zien:
Afbeeldingslocatie: http://www.nme.nu/avatars/avatar.php

Blijkbaar maakt ie de achtergrond donkerder ipv er gewoon dat andere plaatje met transparantie op te plakken. Heb ook al wat gespeeld met gammacorrectie, maar dat maakt het contrast alleen maar groter. Ik gebruik het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  if (function_exists("imagecolorallocatealpha")) {
    for ($i = 0; $i < $blockheight; $i++) {
      $color = ImageColorAllocateAlpha($background, 255, 255, 255, $i * ceil(127 / $blockheight - 1));
      ImageLine($background, 0, $height - $i, $width - 1, $height - $i, $color);
    }
  }
  else {
    $temp = imagecreatetruecolor($width, $height);
    $white = ImageColorAllocate($temp, 255, 255, 255);
    $black = ImageColorAllocate($temp, 0, 0, 0);
    
    imagefilledrectangle($temp, 0, $height - $blockheight + 1, $width - 1, $height - 1, $black);
    imagefilledrectangle($temp, 1, $height - $blockheight + 2, $width - 2, $height - 2, $white);
    
    imagecopymerge($background, $temp, 0, 0, 0, 0, $width, $height, 50);

    imagedestroy($temp);
  }

Ik realiseer me dat het stuk in het "if" deel wat anders output dan in het "else" deel, maar dat is uiteraard for testing purposes only. :)

Enig idee of ik iets verkeerd doe, of dat deze "hack" ook geen oplossing kan bieden?

[ Voor 3% gewijzigd door NMe op 09-06-2004 16:15 ]

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

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

NMe

Quia Ego Sic Dico.

Topicstarter
*kickje* Is er dan niemand die weet hoe ik dit laatste plaatje in orde kan krijgen? Het lijkt me dat ik die toch wel lichter zou moeten kunnen krijgen? Ik zit er nou zo dichtbij, ik kan het gewoon ruiken. :+

Skaah misschien? :)

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

Pagina: 1