Gå til innhold

Hvordan resize et bilde med PHP?


Anbefalte innlegg

Hvordan kan mangjøre om størrelsen på et bilde under upload?

 

Fant en kode på et eksempel på php.net, men jeg får ikke til..

 

$avatar = $_FILES['img']['type'];
$avatar2 = $_FILES['img']['name'];
$avatar3 = $_FILES['img']['tmp_name'];

if ((($avatar == 'image/jpg') || ($avatar == 'image/jpeg') || ($avatar == 'image/JPG') || ($avatar == 'image/gif') || ($avatar == 'image/bmp') ||
($avatar == 'image/png'))) {

move_uploaded_file($avatar3, "v2/images/avatars/" . $avatar2);
rename("v2/images/avatars/" . $avatar2 . "", "v2/images/avatars/" . $_SESSION['id'] . ".jpg");
mysql_query("UPDATE users SET avatar = '" . $_SESSION['id'] . ".jpg' WHERE id = " . $_SESSION['id'] . "");

// File and new size
$filename = "v2/images/avatars/" . $_SESSION['id'] . ".jpg";
$percent = 0.5;

// Content type
header('Content-type: image/jpg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb);

header('Location: /forum/profile/avatar');

}

 

Noen som vet?

 

(Nei, jeg har aldri prøvd å resize bilder utenom i ps før så detta her kan jeg ikke)

 

Edit:

Koden som var på php.net var bare denne

Klikk for å se/fjerne innholdet nedenfor
// File and new size
$filename = "v2/images/avatars/" . $_SESSION['id'] . ".jpg";
$percent = 0.5;

// Content type
header('Content-type: image/jpg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb);

 

Edit:

Bildene skal bli 80x80px hvis dere lurer

Endret av Anders-Moen
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+142

Jeg tror du skal se godt gjennom de funksjonene + argumentene som er i koden din jeg.

Du oppgir et annet filnavn for imagecreatefromjpeg() enn til move_uploaded_file()...

 

Prøv å lage en "lokal" variabel for $_SESSION["id"], da vil koden også se litt ryddigere ut..

 

Jeg skal se om jeg får fikset koden din snart om ingen andre gjør det, men har lekser først :hm:

Endret av Slettet+142
Lenke til kommentar

Vel, han tar jo en rename etter at han har brukt move_uploaded_file. Det nye filenavnet ($_SESISON['id'].jpg) kan du forsåvidt angi direkte i move_uploaded_file.

 

Er enig at det ville vært litt mer oversiktlig, dersom $_SESSION['id'] fikk en "lokal variabel:

$id=$_SESSION['id'];

Jeg savner litt informasjon om hva som er problemet. Er det at bildet ikke blir endret størrelse, eller er det at bildet ikke ligger der det skal ligge ?

 

Du sier også at størrelsen skal bli 80x80. Men utifra koden, så blir størrelsen halvparten av den opprinnelige størrelsen ($width*0,5)

 

Men si litt mer om hva som skjer, og hva som ikke skjer... Evt feilmeldinger du får.

Lenke til kommentar
Du sier også at størrelsen skal bli 80x80. Men utifra koden, så blir størrelsen halvparten av den opprinnelige størrelsen ($width*0,5)

Ja, som jeg sa så fant jeg koden på php.net og jeg har egentlig ingen peiling på hva som foregikk i den. Står ingenting om hva som liksom skjer i koden (ikke noe jeg fant i allfall)

 

 

Jeg tror du skal se godt gjennom de funksjonene + argumentene som er i koden din jeg.

Du oppgir et annet filnavn for imagecreatefromjpeg() enn til move_uploaded_file()...

Nei, men som jeg kan se så er de likevel like.

 

Men si litt mer om hva som skjer, og hva som ikke skjer... Evt feilmeldinger du får.

Det kan jeg gjøre i morra når jeg kjem hjem fra jobb, orker ikke begynne å putte på igjen koden akkurat nå..(tok den av så lenge skjønner du)

Lenke til kommentar
Gjest Slettet+142
Du sier også at størrelsen skal bli 80x80. Men utifra koden, så blir størrelsen halvparten av den opprinnelige størrelsen ($width*0,5)

Ja, som jeg sa så fant jeg koden på php.net og jeg har egentlig ingen peiling på hva som foregikk i den. Står ingenting om hva som liksom skjer i koden (ikke noe jeg fant i allfall)

9658120[/snapback]

 

 

Parameters

 

dst_im

 

    Destination image link resource

src_im

 

    Source image link resource

dst_x

 

    x-coordinate of destination point

dst_y

 

    y-coordinate of destination point

src_x

 

    x-coordinate of source point

src_y

 

    y-coordinate of source point

dst_w

 

    Destination width

dst_h

 

    Destination height

src_w

 

    Source width

src_h

 

    Source height

 

 

edit: spoiler

Endret av Slettet+142
Lenke til kommentar
Gjest Slettet+142

Men nå har jeg faktisk gjort litt, slik at koden din forhåpentligvis skal virke :ohmy:

 

 

 

$avatartype = strtolower($_FILES['img']['type']);
$avatarnavn = $_FILES['img']['name'];
$avataraddr = $_FILES['img']['tmp_name'];

$tillatte_typer = array(
'image/jpg',
'image/jpeg',
'image/gif',
//	'image/bmp',
'image/png'
);

if ( in_array( $avatartype, $tillatte_typer ) ) {

$id = $_SESSION['id'];

$fil = explode(".", $avatarnavn);
if(count($fil) > 0) $filendelse = $fil[count($fil)-1];
else die("Feil: Filetternavn ikke funnet!");
unset($fil);

move_uploaded_file($avataraddr, "v2/images/avatars/" . $avatarnavn);
rename("v2/images/avatars/" . $avatarnavn . "", "v2/images/avatars/{$id}.{$filendelse}");
mysql_query("UPDATE users SET avatar = '{$id}.{$filendelse}' WHERE id = {$id}");

// File and new size
$filename = "v2/images/avatars/{$id}.{$filendelse}";
$bredde = 80;
$hoyde = 80;

// Content type
switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
 header('Content-type: image/jpg');
 $source = imagecreatefromjpeg($filename);
break;
case 'image/gif':
 header('Content-type: image/gif');
 $source = imagecreatefromgif($filename);
 
break;
/*
case 'image/bmp':
 header('Content-type: image/bmp');
 $source = imagecreatefrom??($filename); finnes det funksjon for dette?
break;
*/
case 'image/png':
 header('Content-type: image/png');
 $source = imagecreatefrompng($filename);
break;
default:
 die("Filtypen støttes ikke!");
}

// Load
$thumb = imagecreatetruecolor($bredde, $hoyde);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $bredde, $hoyde, $width, $height);

// Output
unlink($filename);

switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
 imagejpeg($thumb, $filename);
break;
case 'image/gif':
 imagegif($thumb, $filename);	
break;
/*
case 'image/bmp':
 image??($thumb, $filename);
break;
*/
case 'image/png':
 imagepng($thumb, $filename);
break;
}

header('Location: /forum/profile/avatar');

}

 

 

 

Håper den funker ;)

 

EDIT: "Bugfix"

Endret av Slettet+142
Lenke til kommentar
Gjest Slettet+142

Hmm, da får du prøve denne da:

 

 

 

$avatartype = strtolower($_FILES['img']['type']);
$avatarnavn = $_FILES['img']['name'];
$avataraddr = $_FILES['img']['tmp_name'];

$tillatte_typer = array(
'image/jpg',
'image/jpeg',
'image/gif',
// 'image/bmp',
'image/png'
);

if ( in_array( $avatartype, $tillatte_typer ) ) {

$id = $_SESSION['id'];

$fil = explode(".", $avatarnavn);
if(count($fil) > 0) $filendelse = $fil[count($fil)-1];
else die("Feil: Filetternavn ikke funnet!");
unset($fil);

move_uploaded_file($avataraddr, "v2/images/avatars/" . $avatarnavn);
rename("v2/images/avatars/" . $avatarnavn . "", "v2/images/avatars/{$id}.{$filendelse}");
mysql_query("UPDATE users SET avatar = '{$id}.{$filendelse}' WHERE id = {$id}");

// File and new size
$filename = "v2/images/avatars/{$id}.{$filendelse}";
$bredde = 80;
$hoyde = 80;

// Content type
switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
header('Content-type: image/jpg');
$source = imagecreatefromjpeg($filename);
break;
case 'image/gif':
header('Content-type: image/gif');
$source = imagecreatefromgif($filename);

break;
/*
case 'image/bmp':
header('Content-type: image/bmp');
$source = imagecreatefrom??($filename); finnes det funksjon for dette?
break;
*/
case 'image/png':
header('Content-type: image/png');
$source = imagecreatefrompng($filename);
break;
default:
die("Filtypen støttes ikke!");
}

// Load
$thumb = imagecreatetruecolor($bredde, $hoyde);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $bredde, $hoyde, $width, $height);

// Output
unlink($filename);

switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
imagejpeg($thumb, $filename);
break;
case 'image/gif':
imagegif($thumb, $filename);
break;
/*
case 'image/bmp':
image??($thumb, $filename);
break;
*/
case 'image/png':
imagepng($thumb, $filename);
break;
}

echo file_get_contents($filename);

//header('Location: /forum/profile/avatar');

}

 

 

Fjern // foran siste header() om bildet funker ;)

Lenke til kommentar
Gjest Slettet+142

Hehe :p

 

Men ok. Da kommer jeg med kveldens siste forsøk:

 

 

 

$avatartype = strtolower($_FILES['img']['type']);
$avatarnavn = $_FILES['img']['name'];
$avataraddr = $_FILES['img']['tmp_name'];

$tillatte_typer = array(
'image/jpg',
'image/jpeg',
'image/gif',
//	'image/bmp',
'image/png'
);

if ( in_array( $avatartype, $tillatte_typer ) ) {

$id = $_SESSION['id'];

$fil = explode(".", $avatarnavn);
if(count($fil) > 0) $filendelse = $fil[count($fil)-1];
else die("Feil: Filetternavn ikke funnet!");
unset($fil);

move_uploaded_file($avataraddr, "v2/images/avatars/" . $avatarnavn);
rename("v2/images/avatars/" . $avatarnavn . "", "v2/images/avatars/orig_{$id}.{$filendelse}");
mysql_query("UPDATE users SET avatar = '{$id}.{$filendelse}' WHERE id = {$id}");

// File and new size
$filename = "v2/images/avatars/orig_{$id}.{$filendelse}";
$nfilename = "v2/images/avatars/{$id}.{$filendelse}";
$bredde = 80;
$hoyde = 80;

// Content type
switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
 header('Content-type: image/jpg');
 $source = imagecreatefromjpeg($filename);
break;
case 'image/gif':
 header('Content-type: image/gif');
 $source = imagecreatefromgif($filename);
 
break;
/*
case 'image/bmp':
 header('Content-type: image/bmp');
 $source = imagecreatefrom??($filename); finnes det funksjon for dette?
break;
*/
case 'image/png':
 header('Content-type: image/png');
 $source = imagecreatefrompng($filename);
break;
default:
 die("Filtypen støttes ikke!");
}

// Load
$thumb = imagecreatetruecolor($bredde, $hoyde);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $bredde, $hoyde, $width, $height);

// Output

switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
 imagejpeg($thumb, $nfilename);
break;
case 'image/gif':
 imagegif($thumb, $nfilename);	
break;
/*
case 'image/bmp':
 image??($thumb, $nfilename);
break;
*/
case 'image/png':
 imagepng($thumb, $nfilename);
break;
}
unlink($filename);


echo file_get_contents($nfilename);

//header('Location: /forum/profile/avatar');

}

 

 

Edit; "Bugfix" igjen

Endret av Slettet+142
Lenke til kommentar
Gjest Slettet+142

Da har jeg sett koden med dagens nye øyne, og sett av jeg har klart å glemme å sette $width og $height :hm:

 

Fix er her, håper den virker, hade:

 

 

$avatartype = strtolower($_FILES['img']['type']);
$avatarnavn = $_FILES['img']['name'];
$avataraddr = $_FILES['img']['tmp_name'];

$tillatte_typer = array(
'image/jpg',
'image/jpeg',
'image/gif',
// 'image/bmp',
'image/png'
);

if ( in_array( $avatartype, $tillatte_typer ) ) {

$id = $_SESSION['id'];

$fil = explode(".", $avatarnavn);
if(count($fil) > 0) $filendelse = $fil[count($fil)-1];
else die("Feil: Filetternavn ikke funnet!");
unset($fil);

move_uploaded_file($avataraddr, "v2/images/avatars/" . $avatarnavn);
rename("v2/images/avatars/" . $avatarnavn . "", "v2/images/avatars/orig_{$id}.{$filendelse}");
mysql_query("UPDATE users SET avatar = '{$id}.{$filendelse}' WHERE id = {$id}");

// File and new size
$filename = "v2/images/avatars/orig_{$id}.{$filendelse}";
$nfilename = "v2/images/avatars/{$id}.{$filendelse}";
$bredde = 80;
$hoyde = 80;

// Content type
switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
header('Content-type: image/jpg');
$source = imagecreatefromjpeg($filename);
break;
case 'image/gif':
header('Content-type: image/gif');
$source = imagecreatefromgif($filename);

break;
/*
case 'image/bmp':
header('Content-type: image/bmp');
$source = imagecreatefrom??($filename); finnes det funksjon for dette?
break;
*/
case 'image/png':
header('Content-type: image/png');
$source = imagecreatefrompng($filename);
break;
default:
die("Filtypen støttes ikke!");
}

list($width, $height) = getimagesize($filename);

// Load
$thumb = imagecreatetruecolor($bredde, $hoyde);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $bredde, $hoyde, $width, $height);

// Output

switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
imagejpeg($thumb, $nfilename);
break;
case 'image/gif':
imagegif($thumb, $nfilename);
break;
/*
case 'image/bmp':
image??($thumb, $nfilename);
break;
*/
case 'image/png':
imagepng($thumb, $nfilename);
break;
}
unlink($filename);


echo file_get_contents($nfilename);

//header('Location: /forum/profile/avatar');

}

 

Lenke til kommentar

Oi, nå funka den nesten. Nå ble bildet 80x80px og selve bildet ble igjen på bildet om du skjønner og bakgrunnen ble svart.

 

Fra sånn her:

 

til sånn her:

 

 

Edit:

Så det er fortsatt en liten bug...kan det ha noe med at det der var et transparent gif-bilde kanskje?

 

Edit 2:

Prøvde med et "vanlig" jpg-bilde. Det ble resiza uten noen svart bakgrunn iallfall. Selv om grafikken likevel ble ganske dårlig på bildet etter resizing

 

Åssen kan jeg fikse det da mon tro?

 

Og btw, takk for alle de kodene du gadd å skrive! Skal se litt på selve koden og lære litt om hva som gjør hva for å resize bildet når jeg kommer hjem fra jobb (hihi, får litt fri siden jeg måtte på nav og så glemte jeg noe der og nå har de pause og sånn så da får jeg mer fri) :thumbup:

Endret av Anders-Moen
Lenke til kommentar
Gjest Slettet+142

Da har vi i alle fall kommet et steg videre :p

 

La til en linje som forhåtentligvis skal gjøre den svarte bakgrunnen om til hvit bakgrunn:

 

$avatartype = strtolower($_FILES['img']['type']);
$avatarnavn = $_FILES['img']['name'];
$avataraddr = $_FILES['img']['tmp_name'];

$tillatte_typer = array(
'image/jpg',
'image/jpeg',
'image/gif',
// 'image/bmp',
'image/png'
);

if ( in_array( $avatartype, $tillatte_typer ) ) {

$id = $_SESSION['id'];

$fil = explode(".", $avatarnavn);
if(count($fil) > 0) $filendelse = $fil[count($fil)-1];
else die("Feil: Filetternavn ikke funnet!");
unset($fil);

move_uploaded_file($avataraddr, "v2/images/avatars/" . $avatarnavn);
rename("v2/images/avatars/" . $avatarnavn . "", "v2/images/avatars/orig_{$id}.{$filendelse}");
mysql_query("UPDATE users SET avatar = '{$id}.{$filendelse}' WHERE id = {$id}");

// File and new size
$filename = "v2/images/avatars/orig_{$id}.{$filendelse}";
$nfilename = "v2/images/avatars/{$id}.{$filendelse}";
$bredde = 80;
$hoyde = 80;

// Content type
switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
header('Content-type: image/jpg');
$source = imagecreatefromjpeg($filename);
break;
case 'image/gif':
header('Content-type: image/gif');
$source = imagecreatefromgif($filename);

break;
/*
case 'image/bmp':
header('Content-type: image/bmp');
$source = imagecreatefrom??($filename); finnes det funksjon for dette?
break;
*/
case 'image/png':
header('Content-type: image/png');
$source = imagecreatefrompng($filename);
break;
default:
die("Filtypen støttes ikke!");
}

list($width, $height) = getimagesize($filename);

// Load
$thumb = imagecreatetruecolor($bredde, $hoyde);
imagecolorallocate($thumb, 255, 255, 255);

// Resize
//imagecopyresized($thumb, $source, 0, 0, 0, 0, $bredde, $hoyde, $width, $height);
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $bredde, $hoyde, $width, $height);

// Output

switch($avatartype){
case 'image/jpg':
case 'image/jpeg':
imagejpeg($thumb, $nfilename);
break;
case 'image/gif':
imagegif($thumb, $nfilename);
break;
/*
case 'image/bmp':
image??($thumb, $nfilename);
break;
*/
case 'image/png':
imagepng($thumb, $nfilename);
break;
}
unlink($filename);


echo file_get_contents($nfilename);

//header('Location: /forum/profile/avatar');

}

 

 

edit: imagecopyresized->imagecopyresampled

Endret av Slettet+142
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...