php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.07.2007, 14:37  
Erfahrener Benutzer
 
Registriert seit: 12.07.2005
Beiträge: 279
max-dhom
max-dhom eine Nachricht über MSN schicken
Standard Funktion vereinfachen

Hallo zusammen,

ich bastle gerade an einem Uplaodsrkipt für Bilder, und habe wie so oft das Problem mit dem exhausted memory beim verkleinern des Bildes. Meine Funktion lädt das bild hoch, öffnet es dann, verkleinert es und speichert es:

PHP-Code:
function BildKleiner($bild,$PicPathIn$PicPathOut$BreiteMaxTN$HoeheMaxTN$BreiteMax$HoeheMax$QualiTN$QualiMain) {
                      
// Bilddaten feststellen 
                      
$size=getimagesize("$PicPathIn"."$bild"); 
                      
$breite=$size[0]; 
                      
$hoehe=$size[1]; 
                       
                       if(
$hoehe>$breite) {
                               
/* Hochformat, max. Höhe */
                               
$neueHoehe=$HoeheMaxTN;
                            
$neueBreite=intval($breite*$neueHoehe/$hoehe);
                       } else {
                               
/* Querformat, max. Breite */
                               
$neueBreite=$BreiteMaxTN;
                            
$neueHoehe=intval($hoehe*$neueBreite/$breite);                        
                       }
                
                      if(
$size[2]==1) { 
                      
// GIF 
                      
$altesBild=ImageCreateFromGIF("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,
                        
$neueHoehe,$breite,$hoehe); 
                      
$quality=$QualiTN
                      
ImageGIF($neuesBild,"$PicPathOut"."TN"."$bild",$quality); 
                      } 
                
                      if(
$size[2]==2) { 
                      
// JPG 
                      
$altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,
                    
$neueHoehe,$breite,$hoehe); 
                      
$quality=$QualiTN
                      
ImageJPEG($neuesBild,"$PicPathOut"."TN"."$bild",$quality); 
                      } 
                    
                      if(
$size[2]==3) { 
                      
// PNG 
                      
$altesBild=ImageCreateFromPNG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,
                    
$neueHoehe,$breite,$hoehe); 
                      
$quality=$QualiTN
                      
ImagePNG($neuesBild,"$PicPathOut"."TN"."$bild",$quality); 
                      } 
                    
                      
$Tumbnail=$PicPathOut."TN".$bild
                      

                      
// Bilddaten feststellen 
                      
$size=getimagesize("$PicPathIn"."$bild"); 
                      
$breite=$size[0]; 
                      
$hoehe=$size[1]; 
                       
                     if(
$hoehe>$breite) {
                               
/* Hochformat, max. Höhe */
                               
$neueHoehe=$HoeheMax;
                            
$neueBreite=intval($breite*$neueHoehe/$hoehe);
                       } else {
                               
/* Querformat, max. Breite */
                               
$neueBreite=$BreiteMax;
                            
$neueHoehe=intval($hoehe*$neueBreite/$breite);                        
                       }
                
                      if(
$size[2]==1) { 
                      
// GIF 
                      
$altesBild=ImageCreateFromGIF("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,
                        
$neueHoehe,$breite,$hoehe); 
                      
$quality=$QualiMain
                      
ImageGIF($neuesBild,"$PicPathOut"."$bild",$quality); 
                      } 
                
                      if(
$size[2]==2) { 
                      
// JPG 
                      
$altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,
                    
$neueHoehe,$breite,$hoehe); 
                      
$quality=$QualiMain
                      
ImageJPEG($neuesBild,"$PicPathOut"."$bild",$quality); 
                      } 
                    
                      if(
$size[2]==3) { 
                      
// PNG 
                      
$altesBild=ImageCreateFromPNG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,
                    
$neueHoehe,$breite,$hoehe); 
                      
$quality=$QualiMain
                      
ImagePNG($neuesBild,"$PicPathOut"."$bild",$quality); 
                      } 

Kann mir da jemand helfen die Funktion so zu ändern, damit das weniger speicherintensiv wird? Wegen der erweiterung des speichers habe ich schon angefragt, das will mein Provider nicht...

Danke euch,
Max
max-dhom ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.07.2007, 14:46  
CIX88
Gast
 
Beiträge: n/a
Standard

Wie du selber sehen kannst, sind einige Sachen doppelt aufgeführt.

Zitat:
"$PicPathIn"."$bild"
Wer hat dir denn das beigebracht ?
Ohne Anführungszeichen geht es auch.

Nichts besonders, aber einfacher:
http://www.cix88.de/cix_tonne/tonne_...ize_upload.php
(geht ums Prinzip, also nicht einfach kopieren und einfügen)
 
Alt 09.07.2007, 20:12  
Erfahrener Benutzer
 
Registriert seit: 12.07.2005
Beiträge: 279
max-dhom
max-dhom eine Nachricht über MSN schicken
Standard

Ok danke, ich habe jetzt einiges vereinfacht. Nun klappt das bei einem Bild bis ca. 7MB.
Jetzt möchte ich aber mehrere Bilder gleichzeitig hochladen. Dafür habe ich folgendes Skript:

PHP-Code:
        if(isset($_REQUEST['Upload'])) {
            
$x=0;
            foreach(
$_FILES['Bild'] as $wert) {
                if((isset(
$_FILES['Bild']['name'][$x])) && ($_FILES['Bild']['name'][$x]!="")) {
                    
$endung substr(strrchr($_FILES['Bild']['name'][$x], '.'), 1);
                    
$url "".$_GET['id']."-".$x.".".$endung."";    
                    
move_uploaded_file($_FILES['Bild']['tmp_name'][$x],"images/gal/$url");
                    
                    
BildKleiner($url,"images/gal/","images/gal/",200,170,90,1);
                    
BildKleiner($url,"images/gal/","images/gal/",700,500,100,0);
                    
$a=$x+1;
                    echo 
"Bilder Nummer $a wurde erfolgreich hochgeladen!
"
;
                }
                
$x++;
                
            }
        } 
So, aber ab einer gewissen Gesamt-größe bricht er mittendrin ab, es kommt auch keine Fehlermeldung, ich führe dies aber wieder auf den memory-engpass zurück.

Jetzt meine Frage: Ginge es nicht irgendwie, dass er erst das erste Bild hochlädt, dann wird der Uploadvorgang vom Bild 1 abgeschlossen, und dann wird man auf die nchste seite (der user merkt dies nciht) weitergeleitet, wo dann das 2. Bild hochgeladen wird.
Meine Intention ist es, den gesamten Upload-Vorgang ein wenig aufzusplitten.

Geht das irgendwie?

Vielen Dank,
Max Dhom
max-dhom ist offline  
Alt 09.07.2007, 21:07  
CIX88
Gast
 
Beiträge: n/a
Standard

Ich benutze hier jupload (Java) um mehrere Bilder hochzuladen.
Diese werden über eine PHP-Script gejagt, was daraus 2 Vorschaubilder macht.

Natürlich spielt memory_limit eine große Rolle, da spielt es keine Rolle ob die Bilder einzeln hochgeladen werden, oder per jupload.
Wenn der Speicher nicht reicht, ist eben ruhe im Kasten.
 
Alt 09.07.2007, 21:52  
Erfahrener Benutzer
 
Registriert seit: 12.07.2005
Beiträge: 279
max-dhom
max-dhom eine Nachricht über MSN schicken
Standard

hm alles klar. Ich habe jetzt folgende Funktion:
PHP-Code:
function BildKleiner($bild$PicPathIn$PicPathOut$BreiteMax$HoeheMax$quality$tn) {
    
// Bilddaten feststellen 
    
$size=getimagesize("$PicPathIn"."$bild");
    
// Breite =0, Höhe=1; 
    
if($tn==1) { $neuesBild1="TN".$bild.""; }
    else { 
$neuesBild1=$bild; }
                       if(
$size[1]>$size[0]) {
                               
/* Hochformat, max. Höhe */
                               
$neueHoehe=$HoeheMax;
                            
$neueBreite=intval($size[0]*$neueHoehe/$size[1]);
                       } else {
                               
/* Querformat, max. Breite */
                               
$neueBreite=$BreiteMax;
                            
$neueHoehe=intval($size[1]*$neueBreite/$size[0]);                        
                       }
                
                      if(
$size[2]==1) { 
                      
// GIF 
                      
$altesBild=ImageCreateFromGIF("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite$neueHoehe,$size[0],$size[1]);
                      
ImageGIF($neuesBild,"$PicPathOut"."$neuesBild1",$quality); 
                      } 
                
                      if(
$size[2]==2) { 
                      
// JPG 
                      
$altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite$neueHoehe,$size[0],$size[1]);
                      
ImageJPEG($neuesBild,"$PicPathOut"."$neuesBild1",$quality); 
                      } 
                    
                      if(
$size[2]==3) { 
                      
// PNG 
                      
$altesBild=ImageCreateFromPNG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite$neueHoehe,$size[0],$size[1]); 
                      
ImagePNG($neuesBild,"$PicPathOut"."$neuesBild1",$quality); 
                      } 
        
/*
                    $Grafik = ImageCreateFromJPEG("images/news/$url");
                    $Wasserzeichen = ImageCreateFromPNG("wasserzeichen.png");
                    imagecopy($Grafik, $Wasserzeichen, imagesx($Grafik)-imagesx($Wasserzeichen), imagesy($Grafik)-imagesy($Wasserzeichen), 0, 0, imagesx($Wasserzeichen), imagesy($Wasserzeichen));
                    imagejpeg($Grafik,"images/news/$url",100);    
                */

Kann ich es irgendwie erreichen dass er, falles es wieder zu einer Speicherüberschreotung kommt, nciht einfach abbricht und nichtmehr weiter macht, sonder wenigstens eine Fehlermeldung zurückgibt?

Danke,
Max
max-dhom ist offline  
Alt 09.07.2007, 22:17  
CIX88
Gast
 
Beiträge: n/a
Standard

^^^ naja viel Verbessert hat sich ja im Script nicht
Ich dachte du hast einiges umgeschrieben ?

Meist ist es ja so, dass solche Scripte gern als Upload für Bilder von der Digitalkamera benutzt werden. Was dabei aber nicht beachtet wird, die Größe der Bilder, und damit meine ich nicht die Dateigröße in MB, sondern die Breite und Höhe vom Bild.

Hier wird zugern versucht, Bilder ab 2500x1600pixel (oder so ähnlich) hochzuladen, und das ist oft zuviel des guten. Echte Abhilfe wäre da ImageMagick zu benutzen, oder die Bilder vorher kleiner zu machen.

Dein Script ist noch reichlich Verschwenderisch in Sachen Speicher und Performance.
Zum Beispiel benutzt du gar nicht ImageDestroy().

Zitat:
$altesBild=ImageCreateFromGIF("$PicPathIn"."$bild" );
$neuesBild=imagecreatetruecolor($neueBreite,$neueH oehe);
Es ist Blödsinn, aus einen 256-Farben Bild ein TrueColor zu machen.
Sprich -> wo keinen Fraben mehr da sind, kann es nicht besser werden.
Also:

$altesBild=ImageCreateFromGIF("$PicPathIn"."$bild" );
$neuesBild=ImageCreate($neueBreite,$neueHoehe);

Zitat:
ImageGIF($neuesBild,"$PicPathOut"."$neuesBild1",$q uality);
Bei GIF gibt es keinen Parameter zur Qualität.

Dein komplettes Script wurde ohne jeglicher Überlegung erstellt.
Ich vermute => kopieren, einfügen => kacke es geht nicht richtig

Du kannst noch mit file_exists prüfen, ob das Bild angelegt wurde, und entsprechend dazu eine Fehlermeldung erstellen oder eben andere Dinge passieren lassen.
 
Alt 09.07.2007, 22:25  
Erfahrener Benutzer
 
Registriert seit: 12.07.2005
Beiträge: 279
max-dhom
max-dhom eine Nachricht über MSN schicken
Standard

Ja da hst Du durchaus recht, ich bin eben leider kein Profi. Aber danke schonmal für die Hinweise. Sehe ich das richtig dass ich dann noch
PHP-Code:
   imagedestroy($altesBild);
   
imagedestroy($neuesBild); 
anfügen muss?

Die Idee mit file_exists ist super, das werde ich auch gleich ausprobieren!
max-dhom ist offline  
Alt 09.07.2007, 22:29  
CIX88
Gast
 
Beiträge: n/a
Standard

Zitat:
ich bin eben leider kein Profi
Sieht in einigen Jahren ganz anders aus

Jo ImageDestroy() kommt zum schluss, also nach dem erstellen vom Bild.
 
Alt 09.07.2007, 22:31  
Erfahrener Benutzer
 
Registriert seit: 12.07.2005
Beiträge: 279
max-dhom
max-dhom eine Nachricht über MSN schicken
Standard

super danke, jetzt habe ich folgendes:
PHP-Code:
...

$altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild"); 
                      
$neuesBild=imagecreate($neueBreite,$neueHoehe); 
                      
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite$neueHoehe,$size[0],$size[1]);
                      
imagejpeg($neuesBild,"$PicPathOut"."$neuesBild1",$quality); 
                      
imagedestroy($altesBild);
                      
imagedestroy($neuesBild);

... 
ich hab alsp das imagecreatetruecolor entfernt, jetzt ist aber leider die Qualität bzw. die Farben vom Bild total hinüber Aber die Speichermeldung kommt nichtmehr

Max
max-dhom ist offline  
Alt 09.07.2007, 22:39  
Erfahrener Benutzer
 
Registriert seit: 12.07.2005
Beiträge: 279
max-dhom
max-dhom eine Nachricht über MSN schicken
Standard

ein anderes Problem habe ich noch:
PHP-Code:
if(file_exists("$PicPathOut"."$neuesBild1")) { return TRUE; } else { return FALSE; } 
scheint leider nicht zu funktionieren im Falle einer Speicherüberschreitung, da er anscheinend an der Stelle wo sie auftritt sofort alles abbricht...

kann man das dan vielleicht so amchen:
PHP-Code:
if(!imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite$neueHoehe,$size[0],$size[1])) { return FALSE; } 
oder is das krampf?

Danke,
ax
max-dhom ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
Rekursive Funktion bricht ab... duras666 PHP Tipps 2008 9 28.04.2008 11:36
gpc_quotes funktion: verbesserungsvorschläge? Promaetheus PHP Tipps 2007 10 12.08.2007 19:29
Komplexe Funktion: +Übersichtlichkeit, -Performance Jacks Rache PHP Tipps 2006 3 07.06.2006 14:22
PHP-GTK Tutorial Beitragsarchiv 9 02.11.2005 21:07
Rückgabewert einer rekrusiven Funktion PHP-Fortgeschrittene 7 06.10.2005 18:44
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
In einer Funktion auf eine Funktion der Klasse zugreifen phpbeginner PHP Tipps 2005-2 2 28.07.2005 00:30
Funktion in einer Funktion aufrufen? PHP Tipps 2005-2 11 14.06.2005 15:14
[Erledigt] Array-Übergabe in Funktion PHP Tipps 2005 1 08.05.2005 21:05
[Erledigt] Variablen in eine Funktion übernehmen PHP Tipps 2005 1 26.02.2005 17:19
[Erledigt] Wie kann ich beliebig viele Werte an eine Funktion übergeben PHP Tipps 2005 11 25.01.2005 10:44
[Erledigt] Funktion in funktion nicht möglich? PHP-Fortgeschrittene 4 28.11.2004 00:14
[Erledigt] sql syntax error in funktion, kann aber nix finden :( PHP Tipps 2004 10 20.07.2004 19:19
[Erledigt] Referenz auf Funktion übergeben PHP-Fortgeschrittene 7 20.07.2004 09:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
rekursive funktion vereinfachen, php isset vereinfachen, imagecreatefromjpeg truecolor, imagemagick hochformat querformat, imagecreate qualität function, imagecreatetruecolor gtk, imagecopyresampled bricht nach 4 images ab, wasserzeichen tumbnailer 9, funktion vereinfachen, java speicherüberschreitung

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.