Ich habe einen ersten Entwurf zu einer Klasse, die im Prinzip das können soll, was die functions.api.images.php macht, aber einfacher zu nutzen ist und mehr Bildformate unterstützt.
Etliche Bildformate, die mit PHP verarbeitet werden können, sind fürs Internet bedeutungslos (Bitmap, wbmp, xpm, xbm) werden von meiner Klasse aber trotzdem unterstützt.
Die wesentlichen Features sind:
- Als Input funktionieren nicht nur die Pfade zu Bildern im Upload-Bereich, es wird je auch die idupl akzeptiert.
- Wird die Klasse über einen Dateipfad initialisiert, ist es egal, ob das Mandantenverzeichnis, der gesamte Serverpfad, nur ein upload/ oder nichts von dem enthalten ist. meinPfad/meineDatei.jpg geht genauso gut wie var/meinSerbver/meineProjekte/meineDomain/cms/upload/meinPfad/meineDatei.jpg
- Die Klasse übernimmt viel Bildgrößenberechnung. Wer ein Bild skalieren will, muss nur Höhe oder Breite des gewünschten Outputs festlegen. Werden beide Werte festgelegt, kann entschieden werden, ob es sich dabei um Maximal- oder Minimalwerte handelt. Für die Unterscheidung gibt man der Methode (entsprechend zum css-Parameter background-size) die Werte 'cover' oder 'contain' mit.
- Man kann aus einem einmal eingelesenen Bild beliebig viele Versionen generieren.
- Hat man ein sehr großes Bild im Upload-Bereich, von dem man viele kleine Versionen braucht, würde das Umrechnen für jedes Bild lange dauern. Deshalb kann man der Klasse beim Initialisieren Maximalgrößen für das Bild mitgeben. Das Bild wird dann erst kleingerechnet, ehe die kleinen Versionen generiert werden.
- Die Bildqualität lässt sich (sofern für ein Bildformat einstellbar) über die Klasse für jedes Bildformat einzeln festlegen.
- Werden transparente Bilder in nicht-transparente Bilder umgewandelt, lässt sich festlegen, welche Hintergrundfarbe hierbei zum Einsatz kommen soll.
Was nicht geht:
- Die Nutzung von ImageMagick wird nicht unterstützt.
Arbeitsweise:
Wie mit der functions.api.images.php auch, geht es um das Generieren von (in der Regel verkleinerten) Bildversionen, die im cache-Verzeichnis abgelegt werden. Ehe ein Bild generiert wird, wird überprüft, ob es nicht schon existiert. Die get-Funktionen geben den Pfad zur gecachten Datei zurück, unabhängig davon, ob ein Bild generiert werden muss, oder ob es schon existiert.
Beispiele:
Initialisieren
Code: Alles auswählen
//laden über den Dateipfad
$im = new cImage('test/myImage.png');
//laden über die idupl
$im = new cImage(74);
// optional: unser Originalbild hat 2000 × 3000 Pixel
// wir brauchen es aber nur mit max. 400 Px breite
$im = new cImage(74, 400);
Code: Alles auswählen
// generieren einer jpg-Datei der Breite 200 Px:
$src = $im->getJpg(200);
//generieren einer jpg-Datei der Höhe 200 Px:
$src = $im->getJpg(0, 200);
//generieren einer jpg-Datei die mind. 200 Px breit und mindestens 200 Px hoch ist:
$src = $im->getJpg(200, 200);
// alternativ:
$src = $im->getJpg(200, 200, 'cover');
//generieren einer jpg-Datei die max. 200 Px breit und mindestens 200 Px hoch ist:
$src = $im->getJpg(200,200, 'contain');
Code: Alles auswählen
//generieren einer jpg-Datei die genau 200 Px breit und genau 200 Px hoch ist
// (und ggf. nur einen Bildausschnit verwendet):
$src = $im->getJpg(200, 200, 'crop');
Code: Alles auswählen
// generieren einer png-Datei der Breite 200 Px:
$src = $im->getPng(200);
// generieren einer gif-Datei der Breite 200 Px:
$src = $im->getGif(200);
// generieren einer webp-Datei der Breite 200 Px:
$src = $im->getWebp(200);
// etc.
Beim Umwandeln von Bildern kann viel schiefgehen. Damit weder das Errorlog vollläuft, noch die ganze Seite stehenbleibt, sind verschiedene Tests möglich.
Code: Alles auswählen
//laden über die idupl
$im = new cImage(74);
// hat das Laden funktioniert? (Gibts ein Bild mit dieser Id?)
if ($im->exists()) {
...
}
Code: Alles auswählen
// kann der Server webp?
if ($im->typeAvailable('webp')) {
$src = $im->getWebp(200);
}
Beim Einsatz von transparenten Bildern (png oder gif) kann festgelegt werden, welche Hintergrundfarbe beim Rendern von z. B. jpg-Dateien eingesetzt werden soll. Voreingestellt ist die Farbe Weiß (255, 255, 255)
Code: Alles auswählen
// Freigestellte Bilder sollen so beigen Hintergrund haben, wie der Rest der Seite:
$im->setBackgroundColor(245, 245, 220);
$src = $im->getJpg(0, 200);
Code: Alles auswählen
// png-Dateien sollen NICHT transparent sein
$src = $im->allowTransparency(false)->setBackgroundColor(173,255,47)->getPng(250);
Die Bildformate Jpg, Png und Webp erlauben die Wahl verschiedener Bildqualitäten. Hier sind Werte voreingestellt (Jpg: 80, Png: -1, Webp: 80), die aber überschrieben werden können:
Code: Alles auswählen
// generieren einer jpg-Datei mit höchster Qualität
$im->setJpgQuality(100)->getJpg(200,400);
// generieren einer Png-Datei mit Qualität 8
$im->setPngQuality(8)->getPng(200,400);
// generieren einer Webp-Datei mit Qualität 60
$im->setWebQuality(60)->getWebp(200,400);
Bilder werden per Voreinstellung nicht vergrößert. Es ist aber möglich, eine Vergrößerung der Bilder zuzulassen.
Code: Alles auswählen
$im->allowEnlargement(true);
Es ist möglich, Bilder über die idupl zu initialisieren. In diesen Fällen kann es nützlich sein, auch den Pfad zur ursprünglichen Datei zu erhalten:
Code: Alles auswählen
<picture>
<?php
$sizes = array(200 =>200, 400 => 450, 800 => 400, 1200 => 500, 1600 => 600);
$im = new cImage(12);
if ($im->exists()) {
foreach ($sizes as $maxScreenWidth => $imgWidth) {
// generate webp if available
if ($im->typeAvailable('webp')) {
echo '<source media="(max-width:' . $maxScreenWidth. ')" srcset="' . $img->getWebp($imgWidth) . '">';
}
// generate jpg if available
if ($im->typeAvailable('jpg')) {
echo '<source media="(max-width:' . $maxScreenWidth. ')" srcset="' . $img->getJpg($imgWidth) . '">';
}
// welcher Dateipfad gehört zu idupl 12?
echo '<img src="' . $im->getSrc() . '" alt="' . $alt . '" title="' . $title . '">';
// Bildresource freigeben
$im->free();
}
}
?>
</picture>
Es werden immer beide Schreibweisen akzeptiert. Zu den Methoden getJpg() und setJpgQuality() gibt es die Alias-Methoden getJpeg() und setJpegQuality(). Die Methode typeAvailable() akzeptiert 'jpg' und 'jpeg' als Parameter.
Jetzt freu ich mich auf euer Feedback!
Grüße!
Bodil