Avatar billede latrell Nybegynder
11. april 2007 - 20:33 Der er 17 kommentarer og
3 løsninger

Hvordan gemmes billedet på serveren istedet?

Hej Eksperter,

Jeg har følgende script til at vise et spejlvendt billede i en browser. Nu vil jeg bare gerne have det gemt på min server istedet, da jeg har hørt det tager en del cpu kræfter hver gang serveren skal udføre scriptet.

Er der nogen der kan hjælpe så bliver jeg rigtig glad :-)

------------

<?php
header("Content-type: image/gif");

function createbackground($overlay) {

$thepic = imagecreatefromgif('images/bg.gif');
imagealphablending($thepic, true);
$theoverlay = imagecreatefromgif($overlay);
imagecopymerge($thepic, $theoverlay, 0,0,0,0,64,110,100);
imagedestroy($theoverlay);
return imagegif(flipHorizontal($thepic), '', 9);
}

function flipHorizontal(&$img) {
$size_x = imagesx($img);
$size_y = imagesy($img);
$temp = imagecreatetruecolor($size_x, $size_y);
$x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y);
   
if ($x) {
$img = $temp; }
return $img; }
   
   
    $overlay = $_REQUEST['billede'];
    return createbackground($overlay);
?>

------------
Avatar billede spideregg Nybegynder
11. april 2007 - 20:58 #1
Du skal have fat i den linje hvor imagegif() kaldes og erstatte den med:

return imagegif(flipHorizontal($thepic), $filename, 9);

Hvor $filename er navnet på den fil du vil gemme til. Se evt. http://dk.php.net/imagegif
Avatar billede latrell Nybegynder
11. april 2007 - 21:23 #2
Jeg forstår ikke heelt hvad du mener... eller måske gør jeg.. men jeg går ud fra header("Content-type: image/gif"); osv. skal pilles ud af scriptet :-)
Avatar billede spideregg Nybegynder
11. april 2007 - 21:35 #3
Afhængig hvordan du vil bruge scriptet, så ja. Hvis du bare vil køre scriptet en enkelt gang selv kan du trygt fjerne header("Content-type: image/gif").
Avatar billede spideregg Nybegynder
11. april 2007 - 21:41 #4
Du skal naturligvis selv initialisere $filename i koden fra mit første indlæg eller erstatte den med en bogstavelig streng-værdi, hvis det var det der forvirrede dig. Ellers må du skrive igen - jeg sidder her hele aftnen.
Avatar billede latrell Nybegynder
11. april 2007 - 21:45 #5
Jeg kan bare ikke lige finde ud af hvad det er du vil erstatte? Jeg finder ikke nogen imagegif() kald udover min egen der er identisk med den du skrev jeg skulle udskifte min med :-S

Eller er det mig der er gået galt i byen? ;-)
Avatar billede spideregg Nybegynder
11. april 2007 - 21:51 #6
I den kode du postede står der:

return imagegif(flipHorizontal($thepic), '', 9);

I min står der:

return imagegif(flipHorizontal($thepic), $filename, 9);

Forskellen er at anden parameter angiver et filnavn - det gør at GD gemme til harddisken frem for at outputte til browser.
Avatar billede latrell Nybegynder
11. april 2007 - 21:58 #7
Aha.. haha.. ups.. Havde ikke lige set du havde tilføjet det :-)

Jeg prøver mig lige frem og melder tilbage hurtigst muligt.. og tak for hjælpen indtil videre!
Avatar billede latrell Nybegynder
11. april 2007 - 22:07 #8
Jeg har prøvet med:

----------------------------------------

// Baggrund
function createbackground($overlay) {

$thepic = imagecreatefromgif($phprod.'community/habbofigur/bg.gif');
imagealphablending($thepic, true);
$theoverlay = imagecreatefromgif($overlay);
imagecopymerge($thepic, $theoverlay, 0,0,0,0,64,110,100);
imagedestroy($theoverlay);
return imagegif(flipHorizontal($thepic), $filename, 9);
}

// Spejlvend billede
function flipHorizontal($img) {
$size_x = imagesx($img);
$size_y = imagesy($img);
$temp = imagecreatetruecolor($size_x, $size_y);
$x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y);
if ($x) {
$img = $temp; }
return $img; }

$overlay = 'http://www.habbo-media.dk/community/habbofigur/'.$figurid.'.gif';
return createbackground($overlay);
 
copy($filename, $phprod.'community/habbofigur/'.$figurid.'_h.gif'); }

----------------------------------------

Hvilket jeg ikke lige umiddelbart kan få til at virke..
Avatar billede spideregg Nybegynder
11. april 2007 - 22:13 #9
Du initialiserer heller ikke $filename, så vidt jeg kan se? Prøv med følgende i stedet:

// Initialiser $filename
$filename = $phprod.'community/habbofigur/'.$figurid.'_h.gif';

// Baggrund
function createbackground($overlay) {
global $filename;
$thepic = imagecreatefromgif($phprod.'community/habbofigur/bg.gif');
imagealphablending($thepic, true);
$theoverlay = imagecreatefromgif($overlay);
imagecopymerge($thepic, $theoverlay, 0,0,0,0,64,110,100);
imagedestroy($theoverlay);
return imagegif(flipHorizontal($thepic), $filename, 9);
}

// Spejlvend billede
function flipHorizontal($img) {
$size_x = imagesx($img);
$size_y = imagesy($img);
$temp = imagecreatetruecolor($size_x, $size_y);
$x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y);
if ($x) {
$img = $temp; }
return $img; }

$overlay = 'http://www.habbo-media.dk/community/habbofigur/'.$figurid.'.gif';
return createbackground($overlay);
Avatar billede latrell Nybegynder
11. april 2007 - 22:24 #10
Denne sætning skal bare give navnet på det nye billede.

$phprod.'community/habbofigur/'.$figurid.'_h.gif';

Men den brokker sig bare over en helt masse andre ting nu. Jeg tror der er noget forkert i return createbackground($overlay);
Avatar billede spideregg Nybegynder
11. april 2007 - 22:26 #11
Prøv evt. fjerne return helt fra den linje og se hvad der sker:

createbackground($overlay);
Avatar billede latrell Nybegynder
11. april 2007 - 22:34 #12
Sådan.. nu bliver billedet uploadet.
Men der er opstået et andet problem. Mit billede uden "_h" i enden bliver overlappet af det samme billede.

I alt ser min kode sådan ud nu:

---------------------------------------------

// Initialiser $filename
$filename = $phprod.'community/habbofigur/'.$figurid.'.gif';

// Baggrund
function createbackground($overlay) {
global $filename;
$thepic = imagecreatefromgif($phprod.'community/habbofigur/bg.gif');
imagealphablending($thepic, true);
$theoverlay = imagecreatefromgif($overlay);
imagecopymerge($thepic, $theoverlay, 0,0,0,0,64,110,100);
imagedestroy($theoverlay);
return imagegif(flipHorizontal($thepic), $filename, 9);
}

// Spejlvend billede
function flipHorizontal($img) {
$size_x = imagesx($img);
$size_y = imagesy($img);
$temp = imagecreatetruecolor($size_x, $size_y);
$x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y);
if ($x) {
$img = $temp; }
return $img; }

$overlay = 'http://www.habbo-media.dk/community/habbofigur/'.$figurid.'.gif';
createbackground($overlay);
 
    copy($filename, $phprod.'community/habbofigur/'.$figurid.'_h.gif'); }

---------------------------------------------
Avatar billede latrell Nybegynder
11. april 2007 - 22:35 #13
Jeg har allerede et billede der bliver uploadet uden at være spejlvendt med stringnavnet der hører til $figurid, derfor skal det spejlvendte billede uploades med $figurid_h.
Avatar billede spideregg Nybegynder
11. april 2007 - 22:44 #14
Det er også derfor at du skal bruge "_h" i enden på $filename som jeg gjorde tidligere - eller hvad? Det der sker i det sidste stykke kode du har postet er at billedet spejlvendes, skrives til filnavnet $figurid og derefter kopieres til $figurid_h.

Den anden parameter til imagegif() angiver den fil det spejlvendte billede skal gemmes til. Derfor er det slet ikke nødvendigt at bruge copy(), hvis jeg ellers har forstået dig ret. Følgende skulle være tilstrækkeligt:

// Initialiser $filename
$filename = $phprod.'community/habbofigur/'.$figurid.'_h.gif';

// Baggrund
function createbackground($overlay) {
global $filename;
$thepic = imagecreatefromgif($phprod.'community/habbofigur/bg.gif');
imagealphablending($thepic, true);
$theoverlay = imagecreatefromgif($overlay);
imagecopymerge($thepic, $theoverlay, 0,0,0,0,64,110,100);
imagedestroy($theoverlay);
return imagegif(flipHorizontal($thepic), $filename, 9);
}

// Spejlvend billede
function flipHorizontal($img) {
$size_x = imagesx($img);
$size_y = imagesy($img);
$temp = imagecreatetruecolor($size_x, $size_y);
$x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y);
if ($x) {
$img = $temp; }
return $img; }

$overlay = 'http://www.habbo-media.dk/community/habbofigur/'.$figurid.'.gif';
createbackground($overlay);
Avatar billede latrell Nybegynder
11. april 2007 - 22:49 #15
Jo problemet er bare at

http://www.habbo-media.dk/community/habbofigur/1461d4993b6e47_h.gif

Ikke kan åbnes.. Har også prøvet at downloade filen til min computer, som heller ikke kan åbne den :-/
Avatar billede spideregg Nybegynder
11. april 2007 - 22:55 #16
Kan du prøve at erstatte linjen:

createbackground($overlay);

med:

var_dump(createbackground($overlay));

og checke om browseren siger 'true' eller 'false' når du kører scriptet?
Avatar billede latrell Nybegynder
11. april 2007 - 22:59 #17
Ups.. det var mig der var klumret.. Jeg havde glemt at fjerne copy()..

My bad! Men mange mange tak for hjælpen, jeg havde gerne kastet nogle flere point efter dig hvis jeg kunne :-)

Jeg er virkelig taknemmelig for at du ville hjælpe :-)
Avatar billede spideregg Nybegynder
11. april 2007 - 23:00 #18
Selv tak - det var en fornøjelse :)
Avatar billede latrell Nybegynder
11. april 2007 - 23:05 #19
Jeg har lige et afsluttende spørgsmål.. hvis du har tid naturligvis..

Lige nu gemmes det spejlvendte billede på en hvid baggrund for at undgå at baggrunden bliver sort. Er det muligt at gøre baggrunden transparent på en måde?
Avatar billede spideregg Nybegynder
11. april 2007 - 23:45 #20
Ja, det kan det helt sikkert, men jeg kan ikke lige overskue hvor i din kode det skal gøres. Det kan f.eks. gøres med imagecolortransparent(): http://dk.php.net/manual/en/function.imagecolortransparent.php
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