[PHP/GD] thumbnail vraagje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het volgende probleem:
als ik de onderstaande code uitvoer loopt het script vast op het stuk waar $img1 begint.

PHP:
1
2
3
4
5
6
7
8
// dit stopt de originele foto in de database (dit gedeelte werkt)
$db->UpdateBlobFile('produkt','original_image', $userfile, 'produkt_id='.$produkt_id, 'BLOB');
 
//waarom kun je hier niet opnieuw $userfile aanroepen
 $img1 = ImageResize('jpg', $userfile, 50, 50);
 $img2 = ImageResize('jpg', $userfile, 300, 300);
 $db->UpdateBlobFile('produkt','image', $img1, 'produkt_id='.$produkt_id, 'BLOB');
 $db->UpdateBlobFile('produkt','image_groot', $img2, 'produkt_id='.$produkt_id, 'BLOB');


het vreemde is dat als ik bij de image en image_groot i.p.v. $img1 en $img2 gewoon ook $userfile gebruik en de ImageResize functie niet gebruik dan stopt hij dus wel gewoon 3 x een oid object in de database

maar zoals het hierboven staat dan doet hij alleen original_image erin stoppen en met de rest doet hij niks

iemand suggesties?

voor de duidelijkheid, hieronder staat het ImageResize script
PHP:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php

function ImageResize($ext, $image, $maxwidth, $maxheight)
{
        //save output to a buffer
    ob_start();

    //Open the file to resize
        $Extension = strtoUpper($ext);
        if ( ($Extension == "JPG") || ($Extension == "JPEG") )
                $srcImage = ImageCreateFromJpeg( $image );
        else
        if ($Extension == "PNG")
                $srcImage = ImageCreateFromPng( $image );
        else
        if ($Extension == "GIF")
                $srcImage = ImageCreateFromGif( $image );
        else
        if ($Extension == "BMP")
                $srcImage = ImageCreateFromWbmp( $image );
        else
        {
                echo "image type not supported<br>".
                "<a href=\"upload.php\">back</a>";
                exit;
        }
   //obtain the original image Height and Width
   $srcWidth  = ImageSX( $srcImage );
   $srcHeight = ImageSY( $srcImage );


   // the follwing portion of code checks to see if
   // the width > height or if width < height
   // if so it adjust accordingly to make sure the image
   // stays smaller then the $newWidth and $newHeight
   /*if( $srcWidth < $srcHeight ){
       $destWidth  = $newWidth * $srcWidth/$srcHeight;
       $destHeight = $newHeight;
   }else{
       $destWidth  = $newWidth;
       $destHeight = $newHeight * $srcHeight/$srcWidth;
   }
 */

   // stay inside the bounds
        $destWidth = min ($maxwidth, $srcWidth);
        $destHeight = min ($maxheight, $srcHeight);
        $prop = $srcWidth / $srcHeight;

        if ($prop > 1) // landscape
                $destHeight = $srcHeight * $maxwidth / $srcWidth;
        elseif ($prop < 1) // portrait
                $destWidth = $srcWidth * $maxheight / $srcHeight;
//      echo "*".$maxwidth . "-". $srcWidth."*";
  // exit;

   // imagecreate
   // creating the destination image with the new Width and Height
   $destImage = ImageCreateTrueColor( $destWidth, $destHeight);

   //copy the srcImage to the destImage
   ImageCopyResized( $destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight );

   //create the image
   ImageJpeg( $destImage );

   //fre the memory used for the images
   ImageDestroy( $srcImage  );
   ImageDestroy( $destImage );

    //copy output buffer to string
    $resizedImage = ob_get_contents();

        //clear output buffer that was saved
    ob_end_clean();

        return $resizedImage;
}
?>

[ Voor 60% gewijzigd door Verwijderd op 22-08-2005 15:11 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

als ik de onderstaande code uitvoer loopt het script vast op het stuk waar $img1 begint.
Heb je daar ook een foutmelding bij?

Pas je trouwens wel op dat ImageCopyResized (op regel 62) een slechte kwaliteit plaatjes oplevert? Probeer ImageCopyResampled. ;)

[ Voor 35% gewijzigd door NMe op 22-08-2005 15:33 ]

'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!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

$userfile is een string met daarin een bestands lokatie. $img1 en $img2 zijn variabelen met daarin de binaire code van het plaatje zelf.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
in de code stopt de foutmelding nadat het eerste plaatje is ingevoegd
--------------------------------------------------------------------------------
(postgres7): UPDATE produkt SET original_image=19654 WHERE produkt_id=179
--------------------------------------------------------------------------------

in de logs van apache krijg ik de volgende error

PHP Fatal error: Allowed memory size of 26214400 bytes exhausted (tried to allocate 12032 bytes) in imageresize.php on line 11, referer: produkt_add.php?organisatie_id=3&bedrijf_id=55&produkt_
id=

het lijkt er dus op dat hij over z'n geheugen limiet heen gaat, maar dat is vreemd, zo groot is het plaatje niet

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Vergeet niet dat je voor elk plaatje breedte x hoogte x 3 4 bytes geheugen moet hebben.

[ Voor 5% gewijzigd door NMe op 22-08-2005 16:25 . Reden: Hoi Janoz :P ]

'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

Topicstarter
ik test even, maar heb nu in php.ini de verschillende waardes op 25 mb staan, lijkt me toch redelijk genoeg, de plaatjes waarmee ik test zijn niet groter dan 2 mb

Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Het werken met images zuigt echt mega veel geheugen in verhouding tot wat PHP normaal opslurpt. Het is dan ook verstandig om de geheugen limiten een beetje op te rekken.

Zelf heb ik ook een thumbnailscript draaien en deze heeft zo'n 20 a 30 mb geheugen toegang nodig, anders klapt ie er uit met een memory error (zoals jouw script dus doet).

EDIT: Dit script gaat over plaatjes van 1 mb (4 megapixel camera). Let er ook op dat Apache PHP genoeg geheugen geeft. je kan in PHP instellen wat je wilt, als Apache het niet meer leuk vind kapt ie PHP zo af.

[ Voor 25% gewijzigd door ShadowLord op 22-08-2005 16:18 ]

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

De bestanden zijn niet groter dan 2mb. Zodra je echter gaat werken met jpegs worden deze omgezet naar een bitmap en neemt deze over het algemeen breedte x hoogte x 4 (vanwege alignment) bytes. Gezien de grootte van het bestand denk ik aan 5megapixel foto's. Deze zullen in het geheugen dus 4x5 = 20megabyte aan geheugen innemen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
maar hij stond dus al voorheen op 25mb dus dat was dan alsnog groot genoeg, heb alles nu op 50mb gezet, die error is er in iedergeval uit, ook loopt hij er nu ook doorheen zie:

(postgres7): UPDATE produkt SET original_image=19666 WHERE produkt_id=184
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
(postgres7): UPDATE produkt SET image=19667 WHERE produkt_id=184
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
(postgres7): UPDATE produkt SET image_groot=19668 WHERE produkt_id=184

maar de bestanden zijn niet goed, de enige die goed is is original_image, en ik heb ondertussen de volgende error erbij:

PHP Warning: fopen(\xff\xd8\xff\xe0) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /adodb/drivers/adodb-postgres64.inc.php on line 318, referer: admin/beeldbank/produkt_add.php?organisatie_id=3&bedrijf_id=55&produkt_id=

het lijkt er dus op nadat hij de eerste keer die insert heeft gedaan hij na de twee keer als hij dat plaatje moet gaan resizen de file niet meer kan vinden

[ Voor 17% gewijzigd door Verwijderd op 22-08-2005 16:38 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Die nieuwe fout heeft bijna zeker te maken met wat [rml]Janoz in "[ PHP/GD] thumbnail vraagje"[/rml] zegt. :)

'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

Topicstarter
maar ik heb ondertussen die file grootte in php.ini al naar 50 mb gezet, hoe groot zou dat dan moeten worden?

stukje php.ini:

memory_limit 50M 50M
post_max_size 50M 50M
upload_max_filesize 50M 50M

[ Voor 32% gewijzigd door Verwijderd op 22-08-2005 16:43 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

wat is dan het stukje code met fopen? waar je het bestand wilt wegschrijven dus? ik gok dat je namelijk de binaire data van het plaatje als naam wilt gebruiken van je bestand 8)7

Google zoeken naar "\xFF\xD8\xFF\xE0"
dit schijnt een jpeg header te zijn
char header1[] =
" \xFF\xD8\xFF\xE0\x00\x10\x4A\x46\x49\x46\x00\x01\x02\x00\x00\x64"
" \x00\x64\x00\x00\xFF\xEC\x00\x11\x44\x75\x63\x6B\x79\x00\x01\x00"
" \x04\x00\x00\x00\x0A\x00\x00\xFF\xEE\x00\x0E\x41\x64\x6F\x62\x65"
" \x00\x64\xC0\x00\x00\x00\x01\xFF\xFE\x00\x01\x00\x14\x10\x10\x19"
" \x12\x19\x27\x17\x17\x27\x32\xEB\x0F\x26\x32\xDC\xB1\xE7\x70\x26"
"\x2E\x3E\x35\x35\x35\x35\x35\x3E";
:)

edit: even de code aangepast, null hoort er natuurlijk ook bij ook al zie je die niet in de filename terugkomen. Bij \x00 terminate de string dus

[ Voor 99% gewijzigd door DataGhost op 22-08-2005 17:21 ]


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
$userfile is een referentie naar een image object. Die geef je echter mee aan de resize functie als $image. $image gebruik je op regel 11 in dat script voor imagecreatefromjpeg. Deze functie verwacht echter een filename string, geen image object.

Edit: dit weet ik niet 100% zeker, omdat je niet laat zien wat je in $userfile stopt. Ik vermoed echter dat dat een image object is aangezien je deze in dezelfde querie gebruikt als de andere 2 image objecten.

Een quick fix die waarsch. voor je werkt is:

code:
1
function ImageResize($ext, $image, $maxwidth, $maxheight)

//save output to a buffer
ob_start();

//Open the file to resize
$Extension = strtoUpper($ext);
if ( ($Extension == "JPG") || ($Extension == "JPEG") )
$srcImage = ImageCreateFromJpeg( $image );
else
if ($Extension == "PNG")
$srcImage = ImageCreateFromPng( $image );
else
if ($Extension == "GIF")
$srcImage = ImageCreateFromGif( $image );
else
if ($Extension == "BMP")
$srcImage = ImageCreateFromWbmp( $image );
else
{
echo "image type not supported<br>".
"<a href=\"upload.php\">back</a>";
exit;
}

wijzigen naar:

code:
1
function ImageResize($ext, $srcImage, $maxwidth, $maxheight)

//save output to a buffer
ob_start();
[/code]

Ik raad je echter aan om de functie en/of de oproep beter om te schrijven.

[ Voor 74% gewijzigd door narotic op 22-08-2005 16:58 ]

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
:| dat zou goed kunnen het is de standaard adodb library code voor postgresql... en de echo van $userfile = /upload/afdaf
maar dat zou ook zo goed moeten zijn als je naar de code kijkt van de imageresizer

maar het gaat nu dus mis op het moment dat php die image resizer aanroept lijkt het, hij doet dus gewoon niks met die waarden of het bestand is op een of andere vreemde manier verdwenen, maar hij legt dus wel een link naar de oid in de database, alleen is die dus leeg, behalve dus original_image die is gewoon goed en geeft ook de goede waardes.

kortom ik zit best wel vast...

precies narcotic, maar $userfile is nu een bestandsnaam inderdaad

[ Voor 6% gewijzigd door Verwijderd op 22-08-2005 16:58 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Je zit niet vast, de oplossing is nou al 3x gegeven? :? Je probeert binaire data te openen als ware het een file, en dat kan dus niet.

'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!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
$db->UpdateBlobFile('produkt','image', $img1, 'produkt_id='.$produkt_id, 'BLOB');
Daarmee zeg je:
Open het bestand genaaamd $img1 en dump de inhoud als BLOB in de DB. Dit gaat dus niet, want img1 is dus al binaire data. Je hoeft dus helemaal geen bestand te openen.

Je kan dus met een query de data die in $img1 aanwezig is recht de DB in ploppen. Ik ken ADO-DB zelf niet dus ik weet niet welke functie je aan moet roepen voor een normale query, maar het lijkt me triviaal om dat te doen.

[ Voor 6% gewijzigd door ShadowLord op 22-08-2005 17:03 ]

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dank u dank u allemaal...

ik heb zitten slapen img1 levert inderdaad natuurlijk binairy data op ... en geen bestandsnaam zoals $userfile wel doet, ik was in de veronderstelling dat het weer een bestandsnaam was :X
Pagina: 1