Avatar billede htx98i17 Professor
04. august 2012 - 17:30 Der er 6 kommentarer og
1 løsning

resize image

Jeg har set spm og guides til at resize billeder.
Jeg kan bare ikke få dem til at fungere, da mine billeder ikke skal gemmes på serverens disk, men i mysql db.

Jeg har følgende som jeg så tænkte ville fungere

<?php
   
    if($_FILES['fil']['tmp_name'] && $_FILES['fil']['size'] <512000) {
       
        function imageresizejpeg($sourcefile,$maxwidth,$maxheight) {
       
        if($img_src = imagecreatefromstring($sourcefile)) {
            $width = imagesx($img_src);
            $height = imagesy($img_src);
        if($height > $maxheight || $width > $maxwidth) {
                $ratio_height=$maxheight/$height;
                $ratio_width=$maxwidth/$width;
                $ratio=min($ratio_width,$ratio_height);
                $newwidth=intval($width*$ratio);
                $newheight=intval($height*$ratio);
                $img_dst=imagecreatetruecolor($newwidth,$newheight);
                imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
               
               
                        }
            return$img_dst;
           
            imagedestroy($img_src);
            imagedestroy($img_dst);
           
        } else {
            return false;
        }
    }
   
       
$billede = addslashes(fread(fopen($_FILES['fil']['tmp_name'],"r"),filesize($_FILES['fil']['tmp_name'])));
       
$billede = imageresizejpeg($billede,'500','500');
       
mysql_query("INSERT INTO billeder (billede,vareid) VALUES ('$billede','$billede_rel') ") or die(mysql_error());
   

    }
   
?>

Men der kommer fejl:

Warning: imagecreatefromstring() [function.imagecreatefromstring]: gd-jpeg: JPEG library reports unrecoverable error: in

Warning: imagecreatefromstring() [function.imagecreatefromstring]: Passed data is not in 'JPEG' format in

Warning: imagecreatefromstring() [function.imagecreatefromstring]: Couldn't create GD Image Stream out of Data in
Avatar billede htx98i17 Professor
04. august 2012 - 17:44 #1
Hvis jeg fjerner addslashes() i:

$billede = addslashes(fread(fopen($_FILES['fil']['tmp_name'],"r"),filesize($_FILES['fil']['tmp_name'])));


Så får $billede følgende værdi:

Resource id #9
Avatar billede claes57 Ekspert
04. august 2012 - 20:05 #2
jeg ville gemme billeder på en midlertidig plads, og så kalde en anden php, som tjekker at filen er oprettet (eller vente i et loop på 3-5 sekunder - dog maks 10 gange) og så gemme filen i databasen.
Avatar billede htx98i17 Professor
04. august 2012 - 22:18 #3
Hvorfor det? Det virker som om det er lidt for omstændigt...
Avatar billede olebole Juniormester
04. august 2012 - 23:19 #4
<ole>

Der er en del fejl i koden. Hvis du vil læse filen, kan du gøre det på denne måde:

$billede = fread(fopen($_FILES['fil']['tmp_name'],"rb"),filesize($_FILES['fil']['tmp_name']));

Ingen addslashes, men hvis du tester under Windows, skal du bruge b-flaget for at læse binært.

Til gengæld returnerer din funktion imageresizejpeg en billedressource, og ikke en streng. Når du får læst filen som ovenfor, vil du derfor løbe ind i flere problemer.

Prøv at skrive din funktion om til:

    function imageresizejpeg($sourcefile,$maxwidth,$maxheight) {
        if($img_src = imagecreatefromstring($sourcefile)) {
            $width = imagesx($img_src);
            $height = imagesy($img_src);
            if($height > $maxheight || $width > $maxwidth) {
                $ratio_height=$maxheight/$height;
                $ratio_width=$maxwidth/$width;
                $ratio=min($ratio_width,$ratio_height);
                $newwidth=intval($width*$ratio);
                $newheight=intval($height*$ratio);
                $img_dst=imagecreatetruecolor($newwidth,$newheight);
                imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            }
           
            // Start oputput buffering
            ob_start();
            // Output the image
            imagejpeg($img_dst);
            // Read the buffer
            $strImage = ob_get_contents();
            // Stop output buffering
            ob_end_clean();
           
            // Clean up *before* returning
            imagedestroy($img_src);
            imagedestroy($img_dst);
           
            // Return the binary string
            return $strImage;
        } else {
            return false;
        }
    }

Jeg mener dog ikke, der er grund til at skabe strengen både før og i funktionen. Dette ville nok være smartere:

    function imageresizejpeg($sourcefile,$maxwidth,$maxheight) {
        if($img_src = imagecreatefromjpeg($sourcefile)) {
            $width = imagesx($img_src);
            $height = imagesy($img_src);
            if($height > $maxheight || $width > $maxwidth) {
                $ratio_height=$maxheight/$height;
                $ratio_width=$maxwidth/$width;
                $ratio=min($ratio_width,$ratio_height);
                $newwidth=intval($width*$ratio);
                $newheight=intval($height*$ratio);
                $img_dst=imagecreatetruecolor($newwidth,$newheight);
                imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            }
           
            // Start oputput buffering
            ob_start();
            // Output the image
            imagejpeg($img_dst);
            // Read the buffer
            $strImage = ob_get_contents();
            // Stop output buffering
            ob_end_clean();
           
            // Clean up *before* returning
            imagedestroy($img_src);
            imagedestroy($img_dst);
           
            // Return the binary string
            return $strImage;
        } else {
            return false;
        }
    }
   
    if (is_uploaded_file($_FILES['fil']['tmp_name'])) {
        $billede = imageresizejpeg($_FILES['fil']['tmp_name'], 500, 500);
    } else {
        // Do something else
    }

/mvh
</bole>
Avatar billede htx98i17 Professor
05. august 2012 - 18:35 #5
ja, det var lige det jeg tænkte der skulle til.
imagejpeg() kan ikke outputte til en variabel, så jeg ledte efter et alternativ til den funktion i image...()-listen, uden held.

Tak ole, det er utrolig hvad du kan hitte af løsninger.
Avatar billede olebole Juniormester
05. august 2012 - 19:30 #6
Selvtak. Brug et par minutter på at tænke over, hvad der skabte problemet, hvergang du løser et. Så er det bare et spørgsmål om at løse mange nok  =)

Var der noget, der seriøst kunne pisse mig af i mine teenageår, var det, når men far overbærende sagde: "Jaja, det kommer med erfaringen, Ole."!

Det er alligevel utroligt så meget klogere, han er blevet med årene - og stadig bliver det efter sin død  *D
Avatar billede htx98i17 Professor
05. august 2012 - 21:49 #7
Tak for hjælpen.
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