Avatar billede gizp Nybegynder
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.
Avatar billede jakobdo Ekspert
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.
Avatar billede zurekk Nybegynder
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);
    }
Avatar billede jakobdo Ekspert
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);
}
Avatar billede gizp Nybegynder
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.
Avatar billede jakobdo Ekspert
15. august 2007 - 22:04 #5
Du kan godt læse data ud og the fly, og smide det ind igen. :o)
Avatar billede zurekk Nybegynder
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']
Avatar billede zurekk Nybegynder
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.
Avatar billede jakobdo Ekspert
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
Avatar billede gizp Nybegynder
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.";

}
Avatar billede jakobdo Ekspert
16. august 2007 - 11:49 #10
Er der tale om lukketid?
Avatar billede gizp Nybegynder
16. august 2007 - 12:42 #11
Ja, der er bare ingen svar ;)
Avatar billede jakobdo Ekspert
16. august 2007 - 15:36 #12
Svar!
Avatar billede jakobdo Ekspert
16. august 2007 - 18:54 #13
Takker for point.
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