Grafiken verkleinern bei zu großen Grafiken?
*Markus
- php
Hallo,
ich musste feststellen, dass bei viel zu großen Grafiken PHP mit der GD-Bibliothek Probleme hat, diese Grafiken zu verkleinern, aber wie verkleinere ich Grafiken, wenn diese nicht verkleinerbar sind? Ich kann es weder lokal noch auf meinem Webspace. Mir würde zwar nicht einfallen, Grafiken, die 1.5MB groß sind, mit PHP bearbeiten zu wollen, aber wenn dritte, wie Kunden, auf solche Ideen kommen, wüsste ich jetzt nicht, wie ich es verhindern soll.
Zur Zeit verwende ich folgende Klasse, um Bilder aus einem Orginalverzeichnis automatisch für ein Thumbnail-Verzeichnis verkleinern zu lassen:
<?php
class VorschaubildGenerator {
private $verkleinerungsFaktor = 0.2;
private $vorschauFotoVerzeichnis = 'fotosPreview';
// Gibt das verkleinerte Bild zurück
public function minimizePicture($bigPicFilename, $year) {
$sourceImage = '';
//Bild auslesen, Grafiktyp: 1=GIF, 2=JPG, 3=PNG, 4=SWF
list($width, $height, $grafiktyp) = getimagesize($bigPicFilename);
$new_width = $width * $this->verkleinerungsFaktor;
$new_height = $height * $this->verkleinerungsFaktor;
// Resample
$destImage = imagecreatetruecolor($new_width, $new_height);
if ($grafiktyp == 1) { //GIF
$sourceImage = imagecreatefromgif($bigPicFilename);
imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagegif($destImage, $this->vorschauFotoVerzeichnis .
DIRECTORY_SEPARATOR .
$year .
DIRECTORY_SEPARATOR .
basename($bigPicFilename), 100);
}
if ($grafiktyp == 2) { //JPG
$sourceImage = imagecreatefromjpeg($bigPicFilename);
imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagejpeg($destImage, $this->vorschauFotoVerzeichnis .
DIRECTORY_SEPARATOR .
$year .
DIRECTORY_SEPARATOR .
basename($bigPicFilename), 100);
}
if ($grafiktyp == 3) { //PNG
$sourceImage = imagecreatefrompng($bigPicFilename);
imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagepng($destImage, $this->vorschauFotoVerzeichnis .
DIRECTORY_SEPARATOR .
$year .
DIRECTORY_SEPARATOR .
basename($bigPicFilename), 100);
}
// Den neuen Vorschaubildlink zurückliefern
return basename($bigPicFilename);
}
}
?>
Könnte ich hier irgendetwas einbauen, um mit dem Problem fertig zu werden?
Hello,
die GD-Lib hat keine Probleme, große Grafiken zu verkleinern.
Du benötigst dafür allerdings genügend Speicher, weil die Funktionen den GD-Lib speicherorientiert arbeiten.
Bei gepackten Formaten, wie JPG, PNG, GIF, compessed TIFF (das kann die GD sowieso nicht) zählt auch nicht der Speicherbedarf der gepackten Grafik, sondern ihre Ausmaße. Die GD-Lib arbeitet mit einem entpackten Pixel-Image, für das sie für jedes Pixel drei (RGB), bzw sogar vier Bytes Speicher benötigt.
Du kannst also den Bedarf in etwa errechnen.
Dabei benötigst Du den Platz für das entpackte Quellimage, das entpackte Zielimage, und wenn Du mit den "String"-Funktionen der GD arbeitest auch noch Platz für die Quell- und die Zieldatei im Speicher.
m mit dem Problem fertig zu werden?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi,
ich musste feststellen, dass bei viel zu großen Grafiken PHP mit der GD-Bibliothek Probleme hat, diese Grafiken zu verkleinern,
Du kannst sowas über eine .htaccess steuern - sofern Dein Provider das zulässt. Beispiel :
php_value upload_max_filesize 4M
php_value post_max_size 4M
php_value max_execution_time 100
php_value max_input_time 100
php_value memory_limit 50M
Diese Werte sind allerdings ziemlich grosszügig, denn sie stammen aus meiner Ego-Galerie ;-)
Kunden würde ich natürlich erheblich stärker einschränken, und schon beim Upload eine entsprechende Fehlermeldung erzeugen.
if ($grafiktyp == 3)...
Das kann man übrigens etwas weniger aufwändig lösen und sich die Abfragen sparen:
call_user_func ("imagecreatefrom" . $imgsuffix, $image);
Ganz genial ist übrigens das unsharp mask script von Torstein Hønsi, da Bilder beim skalieren immer etwas unscharf werden. Du wendest es auf den handle an, den Dir imagecreatetruecolor zurückgibt, nachdem Du das Bild skaliert hineinkopiert hast.
Gruesse, Joachim
Hello Joachim,
Ganz genial ist übrigens das unsharp mask script
von Torstein Hønsi, da Bilder beim skalieren immer etwas unscharf werden.
guter Tipp.
Kannst Du die drei Parameter erklären und wie es funktioniert?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi Tom,
Kannst Du die drei Parameter erklären und wie es funktioniert?
Er beschreibt das eigentlich recht gut im Script: Stärke des Effektes, Unschärferadius (der unscharfen Maske) und quasi der Schwellwert, ab dem der Schärfeeffekt greift. Letzterer stellt sicher, dass nicht leichte Kontraste plötzlich überbetont werden, sondern nur deutliche Kanten geschärft werden.
Das sind im Grunde ja die gleichen Parameter wie beim Photoshop.
Hey, bist Du umgezogen?
Gruesse, Joachim
Hello,
Das sind im Grunde ja die gleichen Parameter wie beim Photoshop.
Mit Grafiksoftware habe ich mich bisher nur nebenbei beschäftigt.
Eine menschlich verständliche Beschreibung ist mir daher immer lieber :-)
Hey, bist Du umgezogen?
Nicht wirklich.
Nur temporär, sozusagen.
Bis Januar wird dieser Zustand noch anhalten und dann wird man sehen ...
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo,
php_value memory_limit 50M
ich glaube, dass dies hier am besten zu meinem Problem passt. Allerdings scheint es bei mir nicht mal lokal zu funktionieren.
Lokal habe ich folgendes getestet:
Ich habe die .htaccess im Hauptverzeichnis des Webauftritts zu Testzwecken abgelegt mit
php_value memory_limit 500M um ganz sicher zu gehen.
Dennoch bleibt das Script davon unbeeindruckt, hmmm.
Markus
Hello,
Ich habe die .htaccess im Hauptverzeichnis des Webauftritts zu Testzwecken abgelegt mit
php_value memory_limit 500M um ganz sicher zu gehen.
Dennoch bleibt das Script davon unbeeindruckt, hmmm.
Was heißt: "bleibt das Script davon unbeeindruckt"?
Gibt es keine Fehlermeldungen?
Wenn die GD-Lib auf out-of-Memory laufen würde, gäbe es eine Fehlermeldung.
Hast Du die Fehlermeldungen zum Entwickeln auch alle eingeschaltet?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi,
php_value memory_limit 50M
ich glaube, dass dies hier am besten zu meinem Problem passt.
nene, afaik brauchst Du alles, ich hatte das mal ausgetestet. Prüfe doch mal per phpinfo(), ob sich die Werte tatsächlich verändern.
Gruesse, Joachim
Hello,
ich glaube, dass dies hier am besten zu meinem Problem passt.
nene, afaik brauchst Du alles, ich hatte das mal ausgetestet. Prüfe doch mal per phpinfo(), ob sich die Werte tatsächlich verändern.
Wenn die Dateien schon auf seiem Server parken, weil sie z.B. per FTP hochgeladen wurden, braucht er ja die Post-Methoden-Parameter nicht mehr. Dann reicht es vielleicht wirklich, die Speicherparameter hochzusetzen, und das dann auch nur für bestimmte Kunden und für das eine Script.
Ich will damit sagen, er kann _innerhalb_ des Scriptes noch den Speicher hochsetzen, wenn der Serveradmin das nicht hart begrenzt hat. Und er kann das dann selbstverständlich sehr leicht von einer authentifizierung abhängig machen. --> z.B. kostenlose Umwandlung bis 160.000 Pixel Eingabeformat, alles was darübr liegt nur gegen Account (und Billing).
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg