[PHP] watermerk plaatsen op jpg groter dan 2 MB

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een probleem met het plaatsen van watermerken op grote jpg bestanden. Met groot bedoel ik dan dat het fout gaat vanaf 2Mb.

Om te kijken waar het fout gaat heb ik een aantal echo's in de code (zie-onder) gezet om te zien waar het fout gaat. Bij kleinere bestanden werkt alles wel goed.

Als het fout gaat dan word de "3" niet meer ge-echoed. Vreemd, want dit werkte wel goed als ik kleinere files van een watermerk voorzie. Als ik regel 7 en 10 echter omdraai dan blijft het fout gaan op regel 10.

Mijn redenatie: er is ergens een buffer of een stuk geheugen wat volloopt als regel 7 en 10 worden uitgevoerd, om het even in welke volgorde. Error reporting staat op 'E_ALL' maar er worden geen errors gegeven. Ik heb om het probleem verder te isoleren met diverse try-catch constructies geprobeerd, maar ik ben niets wijzer geworden, er worden nergens errors gegeven en de '3' word niet ge-echoed.

Ik heb zitten denken dat ik dit misschien met ini_set zou kunnen oplossen, ik heb geen variabelen kunnen vinden waarvan ik denk dat ze hier iets mee te maken hebben.

Als er iemand is die mij de goede kant op kan helpen zou dat erg fijn zijn.


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
function watermark($SourceFile, $WatermarkFile, $SaveToFile = NULL, $deleteOriginal = NULL){
                echo' 0 ';
                        //use image string method to accept different file formats (jpg, gif a.s.o.)
            $image_string = @file_get_contents($SourceFile) or exit('Cannot open image file.');

            echo '1 ';
            $image = @imagecreatefromstring($image_string) or exit('Not a valid image format.');

            echo '2 ';
            $watermark = @imagecreatefrompng($WatermarkFile) or exit('Cannot open the watermark file.');
            
            echo '3 ';  
            
            imageAlphaBlending($watermark, false);
            imageSaveAlpha($watermark, true);
            
            $imageWidth=imageSX($image);
            $imageHeight=imageSY($image);
            $watermarkWidth=imageSX($watermark);
            $watermarkHeight=imageSY($watermark);
                    
            //calculate new width for watermark
            $scaledWidth = $imageWidth/3;
            $factor = $watermarkWidth/$scaledWidth;
            $scaledHeight = $watermarkHeight/$factor;
            
            //create scaled watermark
            $scaledWatermark = imageCreateTrueColor($scaledWidth, $scaledHeight);
            imagesavealpha($scaledWatermark, true);     
            $trans_colour = imagecolorallocatealpha($scaledWatermark, 0, 0, 0, 127);
            imagefill($scaledWatermark, 0, 0, $trans_colour);
            imagecopyresampled($scaledWatermark,$watermark,0,0,0,0,$scaledWidth, $scaledHeight,$watermarkWidth,$watermarkHeight);
    
            //paste watermark onto target image
            $coordinate_X = ( $imageWidth - 5) - ( $scaledWidth);
            $coordinate_Y = ( $imageHeight - 5) - ( $scaledHeight);
            imagecopy($image, $scaledWatermark, $coordinate_X, $coordinate_Y, 0, 0,$scaledWidth,$scaledHeight);

            //save to file and clean up         
            if($deleteOriginal) unlink($SourceFile);
            if($SaveToFile) imagejpeg ($image, $SaveToFile, 100);
            
            imagedestroy($image);
            imagedestroy($watermark);
            imagedestroy($scaledWatermark);
    }

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Waarom denk je dat je geen errors ziet als je juist op regel 7 & 10 de errors onderdrukt? :P Haal die error suppression weg en je zult waarschijnlijk een "memory exhausted" error krijgen, dit kan je oplossen door je memory limit te verhogen. 16MB zal in eerste instantie wel genoeg zijn denk ik.

[ Voor 52% gewijzigd door AtleX op 11-04-2008 16:21 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 20:45

MueR

Admin Tweakers Discord

is niet lief

Haal eerst eens die vervelende error surpressions weg en kijk welke fouten worden uitgepoept.
Verder, je hebt het over JPGs en gaat vervolgens imagecreatefrompng() aanroepen?

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


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

Bedenk dat een jpg van 2mb gecomprimeerd 2mb is. Wanneer php hiermee aan de slag gaat zal de jpg omgezet moeten worden naar een 'bitmap' waarvoor al snel iets van hoogte*breedte*4bytes aan geheugen nodig is.

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
MueR schreef op vrijdag 11 april 2008 @ 16:22:
Haal eerst eens die vervelende error surpressions weg en kijk welke fouten worden uitgepoept.
Oh, sorry, vergeten te melden. Ook als ik die error surpressions weg haal krijg ik geen foutmeldingen te zien. Ik had ze weer teruggezet omdat het uiteindelijk netter is zo.
MueR schreef op vrijdag 11 april 2008 @ 16:22:
Verder, je hebt het over JPGs en gaat vervolgens imagecreatefrompng() aanroepen?
Die imagecreatefrompng is voor het watermerk, dat is een png met transparantie.
Janoz schreef op vrijdag 11 april 2008 @ 16:25:
Wanneer php hiermee aan de slag gaat zal de jpg omgezet moeten worden naar een 'bitmap' waarvoor al snel iets van hoogte*breedte*4bytes aan geheugen nodig is.
Zou ik dan geen foutmelding terug moeten krijgen, en kan ik ergens een max-waarde aanpassen zodat ie wat grotere dingen wel accepteerd. (of is dat server-technisch echt geen goed idee?

[ Voor 26% gewijzigd door Verwijderd op 11-04-2008 16:31 ]


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Verwijderd schreef op vrijdag 11 april 2008 @ 16:29:
[...]

Oh, sorry, vergeten te melden. Ook als ik die error surpressions weg haal krijg ik geen foutmeldingen te zien. Ik had ze weer teruggezet omdat het uiteindelijk netter is zo.
:X

Ik hoop niet dat je serieus meent dat errors onderdrukken netter is?

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op vrijdag 11 april 2008 @ 16:25:
Bedenk dat een jpg van 2mb gecomprimeerd 2mb is. Wanneer php hiermee aan de slag gaat zal de jpg omgezet moeten worden naar een 'bitmap' waarvoor al snel iets van hoogte*breedte*4bytes aan geheugen nodig is.
De bitmap neemt hoogte x breedte x 3 bytes in beslag, echter, tijdens het mergen van de images moet die hele bitmap 2x in het geheugen passen. In de manual van een programma waar ik met behulp van een vergelijkbaar stuk code images watermark, heb ik daar het volgende over geschreven - en tot nu toe nog nooit melding gehad van iemand waarbij dit niet voldoende was:
Please note that enabling this function uses a rather large amount of memory on the webserver. PHP by default allows a script to use a maximum of 8MB memory. You should probably increase this by changing memory_limit in php.ini. A rough estimation of how much memory it will use is 6 times the number of megapixels in your camera. For example, if you have a 5 megapixel camera, change the line in php.ini to memory_limit=30M

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jottem, problem solved!!!

memory_limit was de oplossing, thnx Jeroenr

Oh, mijn dank is groot _/-\o_ _/-\o_

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je errors niet onderdrukt, heb je geen topic nodig om achter dit soort fouten te komen. :>

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op vrijdag 11 april 2008 @ 16:56:
Als je errors niet onderdrukt, heb je geen topic nodig om achter dit soort fouten te komen. :>
Verwijderd schreef op vrijdag 11 april 2008 @ 16:29:
[...]Ook als ik die error surpressions weg haal krijg ik geen foutmeldingen te zien.[...]

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Er zijn in PHP 3 mechanismen die het weergeven van errors beinvloeden: display_errors, error_reporting en error suppression. Alleen de @ weghalen heeft over het algemeen niet zoveel nut als de andere 2 niet juist zijn ingesteld.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op vrijdag 11 april 2008 @ 16:38:
[...]

De bitmap neemt hoogte x breedte x 3 bytes in beslag, echter, tijdens het mergen van de images moet die hele bitmap 2x in het geheugen passen. In de manual van een programma waar ik met behulp van een vergelijkbaar stuk code images watermark, heb ik daar het volgende over geschreven - en tot nu toe nog nooit melding gehad van iemand waarbij dit niet voldoende was:


[...]
x 3 gaat niet altijd op vanwege byte aligning of een alpha kanaal (zoals bij png). Vandaar dat je beter van 4 uit kunt gaan.

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!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 10-09 09:31

EnnaN

Toys in the attic

AtleX schreef op vrijdag 11 april 2008 @ 16:32:
[...]

:X

Ik hoop niet dat je serieus meent dat errors onderdrukken netter is?
voor een applicatie die je online zet? lijkt me wel. de user heeft niets met die systeemfoutmeldingen te maken, en kan het met een minder ingewikkelde melding prima doen lijkt me.

sig


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

EnnaN schreef op vrijdag 11 april 2008 @ 17:09:
[...]

voor een applicatie die je online zet? lijkt me wel. de user heeft niets met die systeemfoutmeldingen te maken, en kan het met een minder ingewikkelde melding prima doen lijkt me.
Als je dat niet wilt moet je display_errors op off zetten, niet ergens diep in je code totaal niet te debuggen constructies te gaan bouwen om je user maar af te schermen van wat foutmeldingen.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 10-09 09:31

EnnaN

Toys in the attic

als ik het me goed herinner, maar dat kan ik dus mis hebben, kan je als random user die setting niet altijd instellen toch?

maar hoezo is foutmeldingen afvangen en een 'eigen' melding naar de gebruiker sturen (try catch?) ineens een anti-pattern geworden? Volgens mij is dit heel gangbaar....

sig


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

EnnaN schreef op vrijdag 11 april 2008 @ 17:26:
maar hoezo is foutmeldingen afvangen en een 'eigen' melding naar de gebruiker sturen (try catch?) ineens een anti-pattern geworden? Volgens mij is dit heel gangbaar....
Het ging niet over try..catch maar over het onderdrukken van fouten. Try..catch is een goede techniek (mits goed gebruikt), maar gezien de code van de TS denk ik niet dat hij al op dat niveau is. :)

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tijdens het devven wil je iig alle errors zien, en daarvoor wil je niet steeds alle @tjes moeten strippen. Simpel as that.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

nog makkelijker is gewoon een custom error handler schrijven. dan kan je op live omgeving de errors bijvoorbeeld mailen en op de test echo'en.

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Verwijderd schreef op vrijdag 11 april 2008 @ 23:44:
nog makkelijker is gewoon een custom error handler schrijven. dan kan je op live omgeving de errors bijvoorbeeld mailen en op de test echo'en.
Nog beter is het om modernere technieken te gebruiken en gewoon exceptions te throwen. :)

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16:38

Patriot

Fulltime #whatpulsert

AtleX schreef op zaterdag 12 april 2008 @ 09:15:
[...]

Nog beter is het om modernere technieken te gebruiken en gewoon exceptions te throwen. :)
Het gaat hier om functies van PHP zelf, géén van die functies throwen voor zover ik weet exceptions. Of is dit wel zo? Is een gewone error ook altijd te ondervangen met een try..catch-statement?
Pagina: 1