[PHP] Thumbnail wordt zwart?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,
Ik ben een thumbnail script aan het maken, en ben gekomen tot het volgende:

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
$img_name = "$path"."$file";
$new_name = "$path"."$filename"."_t.jpg";
                
$handle = @imagecreatefromjpeg("$path"."$file");
            
$srcWidth  = @imagesx($handle);
$srcHeight = @imagesy($handle);
            
$newHandle = @imagecreatetruecolor(128, 76);
            
if($srcHeight < $srcWidth)
   {
   $ratio = (double)($srcHeight / $dstHeight);
            
   $cpyWidth = round(128 * $ratio);
   if ($cpyWidth > $srcWidth)
      {
      $ratio = (double)($srcWidth / 128);
      $cpyWidth = $srcWidth;
      $cpyHeight = round(76 * $ratio);
      $xOffset = 0;
      $yOffset = round(($srcHeight - $cpyHeight) / 2);
      } else {
      $cpyHeight = $srcHeight;
      $xOffset = round(($srcWidth - $cpyWidth) / 2);
      $yOffset = 0;
      }

   } else {
   $ratio = (double)($srcWidth / 128);
            
   $cpyHeight = round(76 * $ratio);
   if ($cpyHeight > $srcHeight)
      {
      $ratio = (double)($srcHeight / 76);
      $cpyHeight = $srcHeight;
      $cpyWidth = round(128 * $ratio);
      $xOffset = round(($srcWidth - $cpyWidth) / 2);
      $yOffset = 0;
      } else {
      $cpyWidth = $srcWidth;
      $xOffset = 0;
      $yOffset = round(($srcHeight - $cpyHeight) / 2);
      }
   }
            
!@imagecopyresampled($newHandle, $handle, 0, 0, $xOffset, $yOffset, 128, 76, $cpyWidth, $cpyHeight);
            
imagedestroy($handle);
            
@imagejpeg($newHandle, "$path"."$filename"."_t.jpg", 90);
               
@imagedestroy($newHandle);


Alles gaat goed, de files worden gemaakt, en komen op de site te staan, alleen zijn ze helemaal zwart. Het script zorgt ervoor dat de thumbnail 128x76 wordt en het zwarte vlak is ook die grootte. Alleen de kleuren zijn dus verdwenen. Weet iemand hoe dit kan? Alvast bedankt!

[ Voor 10% gewijzigd door Verwijderd op 19-01-2006 20:08 . Reden: Even de code wat leesbaarder maken ]


Acties:
  • 0 Henk 'm!

Verwijderd

Daar kom je vast niet zo makkelijk achter met al die @-jes in je code. Haal die eens weg, zet error_reporting op E_ALL, en ga stap voor stak kijken waar het problem kan zitten.

Acties:
  • 0 Henk 'm!

  • MIster X
  • Registratie: November 2001
  • Laatst online: 16-01 09:39
Ik heb dit zelf gehad wanneer de url van de afbeelding niet correct was, check dat dus even.

[ Voor 45% gewijzigd door MIster X op 19-01-2006 22:26 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Dit komt vaak voor wanneer je OF een foute afbeelding opgeeft, OF foute afmetingen geeft (dat ie bijv op 1x1 wordt gezet).. loop alles eens door, doe error_reporting eens aan. Errors moet je fixen, niet negeren.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
het is gefixed. kon inderdaad het plaatje niet vinden.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, het script werkt nu wel, maar neemt nog veel PHP memory in beslag. Ik heb iets an 15 thumbnails gemaakt, maar nu krijg ik steeds een error ("Allowed memory exhausted"). Mijn PHP memory is dus vol. Het moet door dit script komen, aangezien ik de errors krijg als ik het uitvoer. Ik heb 8MB aan php geheugen, dat lijkt mij toch wel genoeg, aangezien er niet meer dan vijf thumbnails tegelijk worden aangemaakt. Ik gebruik ook de destroyimage() functies, zodat het plaatje niet in het geheugen blijft staan. Heeft iemand enig idee wat er fout is aan het script dat zoveel geheugen in beslag neemt?

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
$img_name = "$path"."$file";
$height = 76;
$width = 128;
$handle = imagecreatefromjpeg("$img_name");
            
$srcWidth  = imagesx($handle);
$srcHeight = imagesy($handle);
            
if($srcHeight < $srcWidth)
{
$ratio = (double)($srcHeight / $height);
            
$cpyWidth = round($width * $ratio);
if ($cpyWidth > $srcWidth)
{
$ratio = (double)($srcWidth / $width);
$cpyWidth = $srcWidth;
$cpyHeight = round($height * $ratio);
$xOffset = 0;
$yOffset = round(($srcHeight - $cpyHeight) / 2);
} else {
$cpyHeight = $srcHeight;
$xOffset = round(($srcWidth - $cpyWidth) / 2);
$yOffset = 0;
}
            
} else {
$ratio = (double)($srcWidth / $width);
            
$cpyHeight = round($height * $ratio);
if ($cpyHeight > $srcHeight)
{
$ratio = (double)($srcHeight / $height);
$cpyHeight = $srcHeight;
$cpyWidth = round($width * $ratio);
$xOffset = round(($srcWidth - $cpyWidth) / 2);
$yOffset = 0;
} else {
$cpyWidth = $srcWidth;
$xOffset = 0;
$yOffset = round(($srcHeight - $cpyHeight) / 2);
}
}
            
imagecopyresampled($newHandle, $handle, 0, 0, $xOffset, $yOffset, $width, $height, $cpyWidth, $cpyHeight);
            
imagedestroy($handle);
            
imagejpeg($newHandle, "$path"."$filename"."_t.jpg", 90);
               
imagedestroy($newHandle);


Is er ook een manier om het geheugen weer te legen (eenmalig nu even, zodat ik weer wat verder kan werken, en proberen het probleem beter te achterhalen)? Of moet dit door de host gebeuren?

Acties:
  • 0 Henk 'm!

  • Arnout
  • Registratie: December 2000
  • Laatst online: 15:29
Roep je het script 1x aan of wordt het meerdere keren op een pagina aangeroepen? In dat geval kan het best veel geheugen consumeren. Het hangt sterk af van hoe groot je bron bestanden zijn. Geef eens wat meer details.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
het script wordt gebruikt om plaatjes, die met ftp geupload zijn, te syncen met de database en er een thumbnail van te maken. Je selecteert dus de plaatjes in een lijst die je wilt toevoegen aan de database en waarvan je de thumbnails wilt maken. Dit kan verschillen tussen 1 en 15 plaatjes. In dit geval probeer ik er nu eentje te doen. Dit plaatje is 600 kb groot, dus dat neemt best wel wat in, maar toch niet het volledige geheugen denk ik?

De precieze error is als volgt:

"Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 8640 bytes) in /home/rottens/domains/360nieuws.nl/public_html/admin/files_sync.php on line 133"

Regel 133 is degene met
PHP:
1
$handle = imagecreatefromjpeg("$img_name");

[ Voor 7% gewijzigd door Verwijderd op 20-01-2006 08:43 ]


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Het plaatje is op de schijf inderdaad 600kb, maar dat is de gecomprimeerde versie. Zodra deze in het geheugen geladen moet worden wordt deze omgezet naar een 2d array van kleurwaarden. Uitgaande van 32bits per pixel (zelfs als het maar 24bit is is het gebruik van 32 handig voor de alignment) dan levert een plaatje van 1024x768 al een geheugen gebruik van anderhalve megabyte op. Een 3 megapixel foto neemt zelfs 6 megabyte geheugen.

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!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Wat is het toch met dit soort constructies dat mensen dat doen:

PHP:
1
$img_name = "$path"."$file";


Variabelen hoeven (moeten) niet tussen quotes..

Acties:
  • 0 Henk 'm!

Verwijderd

Zet dit eens in je code:

PHP:
1
ini_set("memory_limit", "64M");


Daarmee wordt de maximumgrootte verhoogd..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thanks :D werkt nu wel goed. Maar maakt het vergroten van het geheugen voor de rest niet uit? Is het niet beter om alles gewoon in de 8MB te laten werken?

Acties:
  • 0 Henk 'm!

Verwijderd

Het vreet natuurlijk bandbreedte en grotere bestanden vergen ook meer performance van de server, als dat geen probleem is werkt dit prima :)

Acties:
  • 0 Henk 'm!

Verwijderd

Je zegt dat het script gebruikt wordt om een folder die gevuld wordt middels FTP te synchroniseren met een database. Dat zijn typisch handelingen - batches - die gedraaid moeten worden in daluren i.m.o. En tijdens daluren is het minder van belang hoeveel geheugen/serverpreformance je scriptje vereist! Succes.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, als ik grote aantallen doe is dat meestal toch 's avonds laat of 's ochtends. Tussen 3 en 9 worden er wel af en toe wat plaatjes toegevoegd (aangezien het een gamesite is, en screenshots zetten we er dan meteen op), maar dit aantal komt nooit echt boven de 5 tegelijk uit ofzo. Dus is geen probleem. Thanks voor de hulp iedereen.
Pagina: 1