[PHP] imagecreatefromjpeg/gif/png

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • torp
  • Registratie: Januari 2001
  • Laatst online: 08-09 12:48
Na vele, vele uren prutsen kan ik wel wat hulp gebruiken bij dit scriptje om te resizen na upload. Het enige wat ik uiteindelijk in m'n database krijg zijn enkele bytes en misschien is dat ook logisch als je ziet wat het resultaat van de functie is.
Ik heb al een hoop geprobeerd maar de documentatie op php.net is nogal kort. GD is enabled. Als je op deze functies gaat googelen vindt je vele honderden sites met problemen, die blijkbaar eerst goed werkten. Dus ik vraag me af of het soms aan een recente wijziging ligt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if ($temp_file = addslashes(fread (fopen($_FILES['image']['tmp_name'], "r"), filesize($_FILES['image']['tmp_name']))))
{
    $destination = imagecreatetruecolor($new_width, $new_height);

    if($_FILES['image']['type'] == "image/gif")
        $source = imagecreatefromgif($_FILES['image']['tmp_name']); 
    elseif($_FILES['image']['type'] == "image/png")
        $source = imagecreatefrompng($_FILES['image']['tmp_name']); 
    else
        $source = imagecreatefromjpeg($_FILES['image']['tmp_name']); 

    print $source; // (testje) resultaat zoiets als: Resource id #12

    // Nu kunnen we resizen
    imagecopyresampled($destination, $source, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
    ob_start(); 
    imageJPEG($destination); 
    $resized_image = ob_get_contents(); /
    $resized_image = addslashes($resized_image);
    ob_end_clean(); 

    $db->query("INSERT INTO image (image_pid,image_type,image,image_name,image_date) VALUES ('{$my_id}','{$file_type}','{resized_image}','{$file_name}', NOW())");
    imagedestroy($destination);
    imagedestroy($source);
}

[ Voor 17% gewijzigd door torp op 07-04-2008 15:27 ]


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
Wat is precies je vraag/probleem? Krijg je een foutmelding?

Acties:
  • 0 Henk 'm!

  • torp
  • Registratie: Januari 2001
  • Laatst online: 08-09 12:48
Ik krijg vrijwel niks in m'n database: [BLOB - 15 B] en dat betekent: geen afbeelding.
Geen foutmeldingen.

[ Voor 25% gewijzigd door torp op 07-04-2008 15:22 ]


Acties:
  • 0 Henk 'm!

Verwijderd

imagecreatefromjpeg returned alleen ene verwijzing naar het plaatje in het geheugen. je kunt dit niet direct gebruiken om het plaatje op te vragen, maar wel in de andere image functies. wat je vervolgens wilt doen is:
een leeg plaatje maken met de nieuwe dimensies (imagecreatetruecolor)
de inhoud van je orginele plaatje verkleinen en kopieeren (imagecopyresampled)
het verkleinde plaatje outputten en de output opvangen (imagejpeg/imagegif/imagepng) met bijvoorbeeld een buffer (ob_start) of naar een bestand outputten.

plaatjes in je database opslaan is zelden een goed idee trouwens, maak gewoon een verwijzing naar het bestand in je database

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Maar in het stuk code dat je laat zien resize je niet en je insert niet in een DB.

Ik zou zeggen: test eerst eens of je resize werkt (outputten naar een file, wat zowieso een stuk handiger is, afbeeldingen in een database is niet practisch, gebruik gewoon je filesystem daarvoor), kijk dan eens of je een simpele insert voor mekaar krijgt en dan of je je afbeelding BLOB erin kan stoppen.

Aka debugging time.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    function resize_image( &$image, $new_width )
    {
        $width = imagesx( $image );
        $height = imagesy( $image );
        $reduction = $new_width / $width;
        $new_height = $reduction * $height;
        $resized = imagecreatetruecolor( $new_width, $new_height );
        $ret = imagecopyresampled ( $resized, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
        
        if( !$ret )
        {
            die();
        }
        
        return $resized;
    }


nu scaled hij na de opgegeven breedte en geeft een resource terug. Dit is een snippet die ik ergens gebruikt heb HEUL lang geleden maar met een beetje creativiteit kom je ver. :)

Zoals hierboven gezegd word is images in de databse opslaan zelden handig omdat elke image request een DB query is. Kost redelijk wat overhead dus. maar mocht je het toch willen kijk hier

[ Voor 19% gewijzigd door Verwijderd op 07-04-2008 15:30 ]


Acties:
  • 0 Henk 'm!

  • torp
  • Registratie: Januari 2001
  • Laatst online: 08-09 12:48
Om het beknopt te houden had ik het resize-gedeelte weggelaten, die heb ik er nu alsnog bijgezet. Kage: ik vermoedde dat al, het lijkt erop dat de referentie rechtstreeks gebruikt wordt en niet om het bestandje te zoeken. Maar wat is er dan mis?

Het gaat hier om een kleine website met maar 1 plaatje per artikel dus daarom dacht ik dat het wel in de BLOB kon. Afbeeldingen die niet geresized worden komen wel probleemloos in de db terecht.

Edit: ik heb me te lang op het verkeerde stuk gericht want het werkt wel als ik de geschaalde afbeelding rechtstreeks naar de browser stuur.

[ Voor 23% gewijzigd door torp op 07-04-2008 15:49 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'{resized_image}' is niet hetzelfde als '{$resized_image}'. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom moeilijk doen createfromjpeg/gif/png als het zo ook kan:
PHP:
1
$image = imagecreatefromstring(file_get_contents($filename));

[ Voor 94% gewijzigd door Verwijderd op 07-04-2008 16:01 ]


Acties:
  • 0 Henk 'm!

  • torp
  • Registratie: Januari 2001
  • Laatst online: 08-09 12:48
Shroomy: goeie vraag :)

-NMe- heeft ook een prijs, ik ben er nu bijna, alleen doe ik iets fout bij het inserten.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat gaat er nu precies fout dan?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1