Avatar billede saybot Nybegynder
12. juli 2005 - 10:13 Der er 15 kommentarer og
1 løsning

Gem billede med GD

Ohøj...

Jeg har lavet mig et lille script her. Det skriver noget tekst oven på en billede.
Jeg vil gerne have scriptet til at gemme billedet og derefter echo/print det via en <img src=billede>. Som det er nu, bliver billedet bare lavet "on the fly" og så slettet igen.

if ($user && $type =="billede1") {
header("Content-type: image/png");
$im = imagecreatefrompng("$type.png");
$user_width = imagettfbbox(9, 0, "tahoma.ttf", $user);
$x_value2 = (200 - ($user_width[2] + 113));
$color = imagecolorallocate($im, 165, 164, 164);
imagettftext($im, 9, 0, $x_value2, 16, $color, "tahoma.ttf", $user);
imagepng($im);
imagedestroy($im);
exit;
}

husk vand derude... det er VARMT!
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 12:39 #1
Du kan tilføje filnavnet som parameter til imagepng()

imagepng($im, '/tmp/billede.png');

Eller du kan bruge output buffering og file_put_contents() (Eller fopen()+fwrite()+fclose() hvis du er gammeldaws ;))

ob_start();
imagepng($im);
$imageData = ob_get_clean();

file_put_contents('/tmp/billede.png', $imageData);
Avatar billede saybot Nybegynder
12. juli 2005 - 12:53 #2
så hvordan vil det se ud i min kode?
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 13:01 #3
Sådan her

...

$filnavn = '/tmp/billede1.png';
imagepng($im, $filnavn);        // Billedet bliver gemt
imagepng($im);                // Billedet bliver skrevet ud til browseren
imagedestroy($im);
exit;


Men du er nok ikke helt færdig der. Du skal sikkert også checke om billedet allerede er gemt, om det skal overskrives, eller om du vil bruge det gemte billede istedet for at generere et nyt.
Hvis det er noget med at billedet ændrer sig en gang imellem, skal du måske også se på hvor gammel filer er, og evt. overskrive det med en nyere version.
Men selve gemme delen er ovenfor :)
Avatar billede saybot Nybegynder
12. juli 2005 - 13:29 #4
okay... jeg kan ikke rigtig få det til at virke.
Her er min kode som den er nu!

$tal = mt_rand(1,100000);
$filnavn = "type$tal.png";

if ($user && $type =="gmail1") {
header("Content-type: image/png");
$im = imagecreatefrompng("$type.png");
$user_width = imagettfbbox(9, 0, "tahoma.ttf", $user);
$x_value = (200 - ($user_width[2] + 113));
$color = imagecolorallocate($im, 165, 164, 164);
imagettftext($im, 9, 0, $x_value, 16, $color, "tahoma.ttf", $user);
imagepng($im, $filnavn);
imagepng($im);
imagedestroy($im);
exit;
}
___SLUT____

$tal = mt_rand(1,100000); den bruger jeg til at lave et random tal som så bliver brugt til det gemte billedes navn.

men det virker ikke. Billedet bliver genereret nu.
Avatar billede saybot Nybegynder
12. juli 2005 - 13:29 #5
Billedet bliver IKKE genereret nu. *rettelse :)
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:10 #6
Bliver det gemt rigtigt?
Det eneste der er tilføjet er filnavnet og det ekstra imagepng() kald, så det skulle være nemt at finde fejlen.
Hvis du har udskift af fejl slået til, så prøv at sætte content-type til 'text/plain' og se hvad den brokker sig over.
Jeg vil tro at det enten er et problem med at skrive filen (rettigheder, ugyldigt filnavn eller relativ/absolut sti til filen) eller at det måske er de to imagepng() kald lige efter hinanden.

Hvis det er det sidste der sker, kan du droppe det sidstekald og bruge readfile($filnavn) i stedet.
Det er sikkert smartere uanset hvad, da der egentlig ikke er grund til at generere billedet to gange.
Avatar billede saybot Nybegynder
12. juli 2005 - 15:09 #7
jeg har prøvet at skrifte til text/plain og får denne fejl: Warning: imagepng(): Unable to open 'gmail99455.png' for writing in /hsphere/local/home/tobiaswk/uploadimago.net/signatures.php
Avatar billede saybot Nybegynder
12. juli 2005 - 15:14 #8
jeg har løst problemet.

hvordan kan jeg eks. lave en echo hvor den viser billedet via en <img src> ?
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 15:23 #9
Jeg vil mene at den smarteste løsning er at skrive et check ind i dit script, der ser om filen allerede eksisterer, og derefter enten bare skriver filen ud, eller genererer en ny.
På den måde skal du kun lave et enkelt <img> tag, der så selv vil sørge for at outputte det rigtige billede.
Avatar billede saybot Nybegynder
12. juli 2005 - 16:32 #10
jeg er lidt usikker på den med check ind i scriptet. Kunne du give et eks. :)

du skal nok få dine point
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 17:04 #11
Joda

Her er et eksempel på noget lignende et 5 minutters check(300 sekunder).

...

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

if(file_exists($filename)) {
    if((time() - filemtime($filename)) > 300) {
        readfile($filename);
        exit(0);
    }
}

// Herefter genererer du billedet....hvis scriptet når hertil, er filen for gammel, eller den eksisterer ikke. Du kan evt slette filen først med unlink();

$im = imagecreatefrompng("$type.png");

...
Avatar billede saybot Nybegynder
12. juli 2005 - 17:08 #12
det var nu ikke det jeg ville have.

jeg vil bare have en almindelig echo streng hvor jeg udskriver billedet. Så jeg evt. kan tilknytte tekst. Istedet for at den ny bare udskriver billedet.

altså jeg vil have den udskriver det som html med <img> tag og tekst måske.
Avatar billede wuggawugga Nybegynder
14. juli 2005 - 09:04 #13
Det kan du nok ikke gøre i det samme script, eftersom det reelt er et billede i sig selv.
Enten skal du droppe nummer to imagepng() kald, og bruge scriptet som et almindeligt script der skriver html ud, eller også skal du skrive image tagget ud i det script der kalder det vi arbejder med nu.

Det giver det problem at det script der skriver html tagget ud, ikke kender filnavnet, da det er et tilfældigt genereret navn.
Det vil sige at du enten skal finde på en anden måde, der ikke er tilfældig, eller gemme filnavnet et eller andet sted, så du kan bruge det i et html tag senere.
Avatar billede saybot Nybegynder
14. juli 2005 - 10:05 #14
jeg har fået løst det problem selv.

læg et svar, så du kan få dine point :)
Avatar billede wuggawugga Nybegynder
14. juli 2005 - 10:15 #15
Hvordan gjorde du?
Avatar billede saybot Nybegynder
14. juli 2005 - 10:17 #16
lavede en if (file_exists og så echo :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester