14. august 2007 - 15:59
Der er
12 kommentarer og 1 løsning
Thumbnail af billede i database
Hej, nu har jeg længe siddet og tænkt og tænkt og tænkt. Men er ikke rigtig kommet frem til noget brugbart. Jeg har en database hvor jeg gemmer billeder i, men for at jeg ikke skal hente hele "billedet" bare for at vise et lille preview af det (thumbnail), så vil jeg gerne have lavet et thumbnail af billedet. Som samtidig skal ligge i rækken. Men hvordan? Billedet kommer jo over og ligge med et tmp_name på serveren, men kan jeg så ændre på størrelsen af den temp-fil, og hvordan? På forhånd tak.
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
15. august 2007 - 08:23
#1
Når du har dit temp billede, kunne du bruge denne funktion til at resize og gemme billede i mindre format: function resize( $filename, $newfilename, $maxw, $maxh) { $srcim = imagecreatefromjpeg( $filename ); $ow = imagesx( $srcim ); $oh = imagesy( $srcim ); $wscale = $maxw / $ow; $hscale = $maxh / $oh; $scale = ( $hscale < $wscale ? $hscale : $wscale ); $nw = round( $ow * $scale, 0 ); $nh = round( $oh * $scale, 0 ); $dstim = imagecreatetruecolor( $nw, $nh ); imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh ); imagejpeg( $dstim, $newfilename, 85 ); imagedestroy( $dstim ); imagedestroy( $srcim ); return file_exists($newfilename); } PS: Den virker dog kun på jpeg billeder, men kan godt skrives om til at virke på flere.
15. august 2007 - 19:51
#2
Jakobs script med flere filtyper :) function getext( $filename ) { $filename = explode( '.', $filename ); $ext = $filename[(COUNT($filename)-1)]; return $ext; } function resize( $filename, $newfilename, $maxw, $maxh) { $ext = getext( $filename ); if( !preg_match( '/jpg|jpeg|gif|png/', $ext ) ) return false; $srcim = imagecreatefromjpeg( $filename ); $ow = imagesx( $srcim ); $oh = imagesy( $srcim ); $wscale = $maxw / $ow; $hscale = $maxh / $oh; $scale = ( $hscale < $wscale ? $hscale : $wscale ); $nw = round( $ow * $scale, 0 ); $nh = round( $oh * $scale, 0 ); $dstim = imagecreatetruecolor( $nw, $nh ); imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh ); switch( $ext ): case 'jpeg': case 'jpg': imagejpeg( $dstim, $newfilename, 85 ); break; case 'gif': imagegif( $dstim, $newfilename ); break; case 'png': imagepng( $dstim, $newfilename ); break; endswitch; imagejpeg( $dstim, $newfilename, 85 ); imagedestroy( $dstim ); imagedestroy( $srcim ); return file_exists($newfilename); }
15. august 2007 - 21:12
#3
Og sådan, så tager denne gif, jpg og png billeder: function resize( $filename, $newfilename, $maxw, $maxh ) { $types = array( 'jpeg', 'jpe', 'jpg', 'gif', 'png' ); $ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); switch($ext) { case 'jpeg': case 'jpe': case 'jpg': $srcim = imagecreatefromjpeg( $filename ); break; case 'gif': $srcim = imagecreatefromgif( $filename ); break; case 'png': $srcim = imagecreatefrompng( $filename ); break; return false; } $ow = imagesx( $srcim ); $oh = imagesy( $srcim ); $wscale = $maxw / $ow; $hscale = $maxh / $oh; $scale = ( $hscale < $wscale ? $hscale : $wscale ); $nw = round( $ow * $scale, 0 ); $nh = round( $oh * $scale, 0 ); $dstim = imagecreatetruecolor( $nw, $nh ); imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh ); switch($ext) { case 'jpeg': case 'jpe': case 'jpg': imagejpeg( $dstim, $newfilename, 85 ); break; case 'gif': imagegif( $dstim, $newfilename ); break; case 'png': imagepng( $dstim, $newfilename, 85 ); break; return false; } imagedestroy( $dstim ); imagedestroy( $srcim ); return file_exists($newfilename); }
15. august 2007 - 21:54
#4
Det vil betyde at jeg skal gemme billedet er sted på serveren, for så at resize det. Hvor efter jeg så kan slette det igen, nu hvor det skal være i databasen? .. Eller, kan man resize et billede og ligge det ind i databasen on the fly ? Problemet var nemlig ikke at resize det, men måden at resize det og så komme det i databasen som en biniær post.
15. august 2007 - 22:04
#5
Du kan godt læse data ud og the fly, og smide det ind igen. :o)
15. august 2007 - 23:09
#6
Ja, du starter bare med en move_uploaded_file(), og angiver så stien i $filename. Hvis du ikke vil gemme original billedet er jeg ret sikker på du også bare kan gøre det direkte fra temp filen. Altså $_FILES['felt']['tmp_name']
15. august 2007 - 23:12
#7
Og ja jakob, glemte imagecreatefrom***() :D Synes dog det er lidt smartere at bruge en function til at hente ext, da den kan genbruges. Men det er vel en smagssag.
16. august 2007 - 07:55
#8
gizp: Hvilken type billeder har du i din DB? (jpeg, gif, png, bmp) osv.? Man burde kunne gøre noget i stil med: SELECT billede FROM billeder imagecreatefrom***($row['billede']); resize billedet via koden: $ow = imagesx( $srcim ); $oh = imagesy( $srcim ); $wscale = $maxw / $ow; $hscale = $maxh / $oh; $scale = ( $hscale < $wscale ? $hscale : $wscale ); $nw = round( $ow * $scale, 0 ); $nh = round( $oh * $scale, 0 ); $dstim = imagecreatetruecolor( $nw, $nh ); imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh ); Lave en update: ob_start(); // start a new output buffer imagejpeg( $dstim, "", 90 ); $ImageData = ob_get_contents(); $ImageDataLength = ob_get_length(); ob_end_clean(); // stop this output buffer UPDATE billeder SET billede = $ImageData WHERE id = NOGET
16. august 2007 - 11:28
#9
Alletiders :D Fik det til at virke. Her er koden hvis nogen senere for brug for det ;) function resize( $filename, $newfilename, $maxw, $maxh) { $srcim = imagecreatefromjpeg( $filename ); $ow = imagesx( $srcim ); $oh = imagesy( $srcim ); $wscale = $maxw / $ow; $hscale = $maxh / $oh; $scale = ( $hscale < $wscale ? $hscale : $wscale ); $nw = round( $ow * $scale, 0 ); $nh = round( $oh * $scale, 0 ); $dstim = imagecreatetruecolor( $nw, $nh ); imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh ); imagejpeg( $dstim, $newfilename, 85 ); imagedestroy( $dstim ); imagedestroy( $srcim ); return file_exists($newfilename); } if (!empty($_FILES['image']['tmp_name'])) { $name = $_FILES['image']['name']; $size = $_FILES['image']['size']; $type = $_FILES['image']['type']; $tmp = $_FILES['image']['tmp_name']; $description = $_POST['description']; $data = addslashes(fread(fopen($tmp, "r"), $size)); $temp = resize($tmp,$tmp,"120","100"); $thumb = base64_encode(addslashes(fread(fopen($tmp, "r"), $size))); $image = base64_encode($data); mysql_query("INSERT INTO Images (Data,Thumbnail) VALUES ('".$data."','".$thumb."')") or die(); echo "Billedet er gemt i databasen."; }
16. august 2007 - 11:49
#10
Er der tale om lukketid?
16. august 2007 - 12:42
#11
Ja, der er bare ingen svar ;)
16. august 2007 - 15:36
#12
Svar!
16. august 2007 - 18:54
#13
Takker for point.
Vi tilbyder markedets bedste kurser inden for webudvikling