5 Stimmen

php-Komprimierung von Bildern zeigt unterschiedliche Ergebnisse

Ich habe das Firebug-Dienstprogramm für die Seitengeschwindigkeit verwendet, und einer der Vorschläge lautete, die Bilder zu komprimieren - also habe ich den folgenden Code geschrieben, um das Bild zu komprimieren

$filename="http://localhost.com/snapshots/picture.png";
$img = imagecreatefrompng($filename);
$this->\_response->setHeader('Content-Type', 'image/png');
imagepng($img,null,9);
imagedestroy($img);

Die tatsächliche Bildgröße beträgt jetzt 154K Ich habe also mit verschiedenen Qualitätsstufen experimentiert und folgendes herausgefunden

imagepng($img,null,0); --> Size = 225K
imagepng($img,null,1); --> Size = 85.9K
imagepng($img,null,2); --> Size = 83.7K
imagepng($img,null,3); --> Size = 80.9K
imagepng($img,null,4); --> Size = 74.6K
imagepng($img,null,5); --> Size = 73.8K
imagepng($img,null,6); --> Size = 73K
imagepng($img,null,7); --> Size = 72.4K
imagepng($img,null,8); --> Size = 71K
imagepng($img,null,9); --> Size = 70.6K

Sehen diese Ergebnisse korrekt aus? Ich bin mir nicht sicher, warum bei Qualität 0 die Bildgröße größer ist als die tatsächliche Größe.

Zweitens ist dies der beste Weg, um in PHP zu gehen, um Bilder zu komprimieren, bevor sie im Browser gerendert werden, um die Leistung zu verbessern.

Basierend auf den Vorschlägen, dass es besser ist, das Bild einmal beim Speichern zu komprimieren, habe ich den Code ausgegraben, der vom Flash-Programm aufgerufen wird, um den Schnappschuss zu erzeugen.

$video = $this->\_getParam('video'); 
$imgContent = base64\_decode($this->\_getParam('snapshot'));
file\_put\_contents("snapshots/" . $video . ".png", $imgContent);

BEARBEITET Auf der Grundlage von Alvaros Vorschlag habe ich die folgende Änderung am Code vorgenommen, die eine viel kleinere jpg-Datei erzeugt

$video = $this->\_getParam('video'); 
$imgContent = base64\_decode($this->\_getParam('snapshot'));
file\_put\_contents("snapshots/" . $video . ".png", $imgContent);

$filename="snapshots/".$video.".png";
$img = imagecreatefrompng($filename);
imagejpeg($img,'test.jpg',75);

Dies ist also ein 3-stufiger Prozess

  1. Erstellung des Ausgangsbildes mit file_put_contents
  2. Verwenden Sie imagecreatefrompng und imagejpeg, um die Datei zu komprimieren und ein kleineres Bild zu erzeugen
  3. Löschen Sie das Originalbild

Ist dies die optimale Vorgehensweise?

4voto

Álvaro González Punkte 134708

Da PNG eine verlustfreie Datenkomprimierung verwendet, besteht die einzige Möglichkeit, eine vernünftige Komprimierung in einem PNG-Bild zu erreichen (von Ausnahmefällen abgesehen) darin, es als Palette (und nicht als Echtfarbe) zu speichern und die Anzahl der Farben zu reduzieren. Sie scheinen eine Art von Bildschirmfotos zu verarbeiten. Sie können kleinere Dateigrößen erzielen, wenn Sie eine verlustbehaftete Komprimierung verwenden, d. h. als JPEG speichern. In beiden Fällen verringern Sie sowohl die Dateigröße als auch die Bildqualität. Sie könnten es auch mit dem GIF-Format versuchen, das bei kleinen Diagrammen in der Regel kleiner ist.

Zu guter Letzt sollten Sie Bilder einmal komprimieren (normalerweise beim Hochladen) und nicht jedes Mal, wenn sie bereitgestellt werden. Ich nehme an, Ihr Code ist nur ein schneller Test, aber ich erwähne das nur für den Fall.

Antwort auf die aktualisierte Frage:

Ich bin mit den PHP-Bildfunktionen nicht vertraut, aber Sie sollten wahrscheinlich eine Kombination aus imagecreatefrompng() y imagejpeg() . Überlegen Sie auch, ob Sie das Original-PNG für spätere Zwecke aufbewahren müssen oder ob Sie es wegwerfen können.

3voto

mck89 Punkte 18347

Sie haben den letzten Parameter nicht verstanden, das ist nicht die Qualität, sondern der Komprimierungsgrad, so dass eine Erhöhung die Bildgröße verringern wird. Wie auch immer, ich habe diese Methode vor, um png-Bilder zu komprimieren und es funktioniert gut, so dass ich denke, Sie sollten es weiterhin verwenden.

0voto

Shikiryu Punkte 10080

1- Das Ergebnis scheint korrekt zu sein, da 0 bedeutet keine Komprimierung

Qualität

Komprimierungsgrad: von 0 (keine Kompression) bis 9.

Es ist normal, dass die 0 Datei größer sein als das Original (das zu Beginn leicht komprimiert sein kann). Sie müssen die Dateikomprimierung und den PHP GD Image Constructor verstehen.

2- IMHO wäre es am klügsten, Ihre png-Dateien zu komprimieren, bevor Sie sie auf Ihren Server hochladen (das gilt natürlich nur, wenn Sie die Wahl haben: statisch, wenige Dateien).

Hilfe dazu :

Wenn es darum geht, dynamisch zu sein, ist das php die richtige Wahl.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X