[PHP] Transparante GIF/PNG met email erin wil niet lukken

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 01-09 15:18
Ik ben bezig om een plaatje te laten genereren vanuit de GD-library in PHP.
In principe lukt dit wel, ik zit alleen met het probleem dat ik hem niet tranparant krijg. :( Nu las ik in deze post dat GIF sinds enige tijd vanwege een aanklacht GIF niet meer ondersteund. :r

Dus ik denk, dan pak ik wel een PNG. Maar dat schijnt IE weer niet te ondersteunen. Nu staat in deze post hoe dat wel kan. Maar dan moet je dus een aantal dingen installeren in de root van je webserver.

Het probleem bij mij is alleen dat het dus niet tranparant is, ook niet in Mozilla, wat dus wel zou moeten werken lijkt me :? Wie heeft het al wel werkend? Wat doe ik fout in mijn PHP-code:
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
function OutputTextAsImage ($userid) {
    header("Content-type: image/png");

    //Database Connectie
    OpenConnection();
    $SQL    = "SELECT email FROM users WHERE user_id=". $userid;
    $rs     = OpenRecord($SQL);
    $line   = GetNextLine($rs);
    $string = $line['email'];
    //Sluit de connectie
    CloseConnection();

    $im = imagecreate((strlen($string)+2)*6, 16);
    $bg = imagecolortransparent($im);
    imagefill($im, 0, 0, $bg);
    $textcolor = imagecolorallocate($im, 50, 50, 150);

    imagestring($im, 2, 0, 1, " ".$string." ", $textcolor);
    imagepng($im);
    imagedestroy($im);
}

$userid = $_GET['userid'];
OutputTextAsImage($userid);
exit();
?>
En zo roep ik de image aan in m'n pagina.
HTML:
1
[img]"str2img.php?userid=20031213165510"[/img]



Resultaat in browser :)

[ Voor 17% gewijzigd door FitNiX op 06-02-2004 10:12 ]


Acties:
  • 0 Henk 'm!

  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08 15:02
Als je 1 kleur of kleurvlak transparant wil maken (dus a la GIF) dan kan dit standaard wel met PNG, ook onder IE. Echter bij PNG kan je 256 waarden voor de transparantie instellen ipv 1. Hierdoor kan je dus in stapjes van 1/256 werken zodat je nette randen krijgt.

Dat laatste is bij jou echter niet nodig. Je hoeft dan ook geen spul te installeren of workarounds te gebruiken. (bij mijn weten) Haal die dan ook weg om problemen te voorkomen. :)

Dan blijft je script dus over maar daar heb ik niet zoveel verstand van. ;)

Human Bobby


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 01-09 15:18
Justice schreef op 05 februari 2004 @ 12:11:
Als je 1 kleur of kleurvlak transparant wil maken (dus a la GIF) dan kan dit standaard wel met PNG, ook onder IE. Echter bij PNG kan je 256 waarden voor de transparantie instellen ipv 1. Hierdoor kan je dus in stapjes van 1/256 werken zodat je nette randen krijgt.

Dat laatste is bij jou echter niet nodig. Je hoeft dan ook geen spul te installeren of workarounds te gebruiken. (bij mijn weten) Haal die dan ook weg om problemen te voorkomen. :)

Dan blijft je script dus over maar daar heb ik niet zoveel verstand van. ;)
Gelukkig had ik dat spul idd nog niet geïnstalleerd, Ik weet niet eens of ik wel rechten heb om dat te doen, lijkt me van niet. :?

Nu alleen mijn code-fout nog verwijderen :o

Acties:
  • 0 Henk 'm!

  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 26-08 09:08

Kippenijzer

McFallafel, nu met paardevlees

Overigens maak je nog helemaal niets transparant. Je definieert enkel een kleur die transparant moet worden als je hem zou gebruiken. Doe eens een imagefill na de definitie van $bg voor het volle image met kleur $bg
[edit]Dus:

PHP:
1
imagefill($im,0,0,$bg);
voor het zetten van de tekst zou moeten voldoen.

[ Voor 19% gewijzigd door Kippenijzer op 05-02-2004 12:19 ]


Acties:
  • 0 Henk 'm!

  • waik
  • Registratie: Mei 2003
  • Laatst online: 18-12-2020
je moet eerst het plaatje inkleuren en dan de transparency zetten (zie php.net:http://nl3.php.net/manual/en/function.imagecolortransparent.php)

php.net: "Note: The transparent color is a property of the image, transparency is not a property of the color. Once you have a set a color to be the transparent color, any regions of the image in that color that were drawn previously will be transparent. "


je bent dus te vroeg met het transparant maken.

[ Voor 3% gewijzigd door waik op 05-02-2004 12:21 ]


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

probeer dit eens ...

PHP:
13
14
15
16
17
18
19
20
    $im = imagecreate((strlen($string)+2)*6, 16); 
    $bg = imagecolortransparent($im); 
// Volgens mij moet je de transparante kluer nog wel gebruiken
    imagefill ( $im, 0, 0, $bg); 

    $textcolor = imagecolorallocate($im, 50, 50, 150); 

    imagestring($im, 2, 0, 1, " ".$string." ", $textcolor);


Not tested... Ow ook nog nooit geprobeerd... :) Dus het kan ook helemaal niet werken... :)

[edit]
Ben weer eens te laat... :)

[ Voor 8% gewijzigd door LuCarD op 05-02-2004 12:26 ]

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 01-09 15:18
Iets aangepast, maar nu doet ie vaag:

Onder Internet Explorer
Afbeeldingslocatie: http://www.lustgeenbier.com/tweakers/transp_ie.gif

Onder Mozilla
Afbeeldingslocatie: http://www.lustgeenbier.com/tweakers/transp_mozilla.gif

Met deze code dus:
PHP:
1
2
3
4
    $im = imagecreate((strlen($string)+2)*6, 16);
    $bg = imagecolortransparent($im);
    imagefill($im, 0, 0, $bg);
    $textcolor = imagecolorallocate($im, 50, 50, 150);

[ Voor 100% gewijzigd door FitNiX op 05-02-2004 13:31 . Reden: code toegevoegd ]


Acties:
  • 0 Henk 'm!

  • MikeN
  • Registratie: April 2001
  • Laatst online: 20-09 12:51
Bekijk de code op http://nl.php.net/imagecolortransparent eens heel goed.
Eerst een imagecolorallocate en dan een imagecolortransparent.

Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 01-09 15:18
MikeN schreef op 05 februari 2004 @ 15:29:
Bekijk de code op http://nl.php.net/imagecolortransparent eens heel goed.
Eerst een imagecolorallocate en dan een imagecolortransparent.
Zo te zien is die
PHP:
1
imagefill($im, 0, 0, $bg);
niet eens nodig :o
Het werkt namelijk ook al zonder die regel, zowel onder IE en Mozilla. :)

Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 01-09 15:18
* FitNiX Hieronder volgt nog een keer alle code die nodig is om een tranparante PNG te laten genereren waarin je een variabele tekst kunt printen. :)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//Gegevens ophalen uit de GET
$userid = $_GET['userid'];
$strklr = $_GET['strklr'];
if (strlen($strklr)!= 6)
    $strklr = "000000";
OutputTextAsImage($userid, $strklr);
exit();


//Output een image met daarin een string
function OutputTextAsImage ($userid, $strklr) {
    header("Content-type: image/png");

    //Database Connectie
    OpenConnection();
    $SQL    = "SELECT email FROM users WHERE user_id=". $userid;
    $rs     = OpenRecord($SQL);
    $line   = GetNextLine($rs);
    $string = $line['email'];
    //Sluit de connectie
    CloseConnection();

    //Image object aanmaken
    $img = imagecreate((strlen($string)+2)*6, 16);
    //Een kleur object aanmaken en deze meteen een kleur toewijzen
    $bg  = imagecolorallocate($img, 255, 255, 255);
    //Deze kleur, de transparante kleur maken
    imagecolortransparent($img, $bg);

    //De Hexadecimale kleur omzetten in een RGB waarde
    $arrColor  = hex2int($strklr);
    $textcolor = imagecolorallocate($img, $arrColor['r'], $arrColor['g'], $arrColor['b']);

    //De text erin zetten
    imagestring($img, 2, 0, 1, " ".$string." ", $textcolor);
    imagepng($img);
    imagedestroy($img);
}


//Zet een Hexadecimale waarde om naar een RGB waarde
function hex2int($hex) {
    return array('r' => hexdec(substr($hex, 0, 2)),  // 1st pair of digits
                 'g' => hexdec(substr($hex, 2, 2)),  // 2nd pair
                 'b' => hexdec(substr($hex, 4, 2))); // 3rd pair
}

* FitNiX En dan ook de aanroep nog maar een keer: ;)
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>LustGeenBier - Image Mail tester</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<LINK REL="STYLESHEET" TYPE="text/css" HREF="../style/style.css">
</HEAD>
<BODY>
[img]"str2img.php?userid=20031213165510&imgklr=0000FF"><BR>
<img[/img]

</BODY>
</HTML>

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Tnx, Kermit! Cool van je! _/-\o_

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 01-09 15:18
Room42 schreef op 07 februari 2004 @ 16:23:
Tnx, Kermit! Cool van je! _/-\o_
No Problemo.
Als iedereen dit nou eens zou doen, ik kom zo vaak topics tegen via de search, en dan staat er als laatste post vaak alleen maar iets als, als ik het weet, post ik het hier. En dan komt er nooit meer een post :( . Ik bedoel zet er dan in dat je het niet meer gevonden hebt ofzo...
Pagina: 1