Antworten auf deine Fragen:
Neues Thema erstellen

PHP - Thumbnail mit Bildpfad

Fuehrwehrma

Noch nicht viel geschrieben

Hallo erstmal!

Stosse wieder einmal an meine PHP-Kenntniss-Grenze... :(

Ich habe ein PHP-Script geschriben, das mir automatisch quadratische Thumbnails (Vorschaubilder) erstellt. Funktioniert auch einwandfrei.
Zurzeit muss ich mit dem Script, immer die Originalbilder in einen Ordner (thumbs) kopieren, was aufwendig / lästig ist.

Mein Problem / Anliegen:
Kann man das Script so erweitern, dass man die Originalbilder nicht in einen anderen Ordner kopieren muss, d.h.
dass das Script direkt die Originalbilder nimmt (Original-Ordner) und in einem andren Ordner (thumbs) speichert?

Die Ordnerstruktur sieht in etwa so aus:
Einen Gallery-Ordner. In diesem Ordner ist das Script, ein Ordner (images) mit den Originalbilder drin und einen Thumbnail-Ordner (thumbs).

Habe schon gegoogelt aber nichts brauchbares für mein Script gefunden.
Auf PSD Tutorials habe ich auch schon gesucht, aber das Script, das angeboten wird, ist zu unübersichtlich, resp. hat zu wenig Erklärungen
(für mich zumindest).

PHP:
<?php

// PHP-Fehlermeldungen anzeigen --> Alle
error_reporting (E_ALL);

// Funktionsaufruf
foreach (glob ("*.jpg") as $Image)
    {
    qThumb ($Image, 90);    // "$Image, Zahl" --> Zahl = Breite / Höhe des Bildes in Pixel
    }

// Funktion
function qThumb ($Image, $ThumbEdgeLength)
    {
    // Masse ermitteln
    $OriginalImagedInfo   = getimagesize( $Image);
    $OriginalImageWidth = $OriginalImagedInfo[0];
    $OriginalImageHight  = $OriginalImagedInfo[1];
    $OriginalEdgeLength = $OriginalImageWidth < $OriginalImageHight ? $OriginalImageWidth : $OriginalImageHight;

    // Temporäres Bild vom Original erzeugen
    $TempImage = imagecreatefromjpeg ($Image);
    
    // Neues Bild erstellen
    $NewImage = imagecreatetruecolor ($OriginalEdgeLength, $OriginalEdgeLength);
    
    // Originalbild in neues Bild einfügen
    if ($OriginalImageWidth > $OriginalImageHight)
        {
        imagecopy ($NewImage, $TempImage, 0, 0, round ($OriginalImageWidth-$OriginalEdgeLength) / 2, 0, $OriginalImageWidth, $OriginalImageHight);
        }
    else if ($OriginalImageWidth <= $OriginalImageHight)
    {
        imagecopy ($NewImage, $TempImage, 0, 0, 0, round ($OriginalImageHight-$OriginalEdgeLength) / 2, $OriginalImageWidth, $OriginalImageHight);
    }
    
    $Thumbnail = imagecreatetruecolor ($ThumbEdgeLength, $ThumbEdgeLength);
    imagecopyresampled ($Thumbnail, $NewImage, 0, 0, 0, 0, $ThumbEdgeLength, $ThumbEdgeLength, $OriginalEdgeLength, $OriginalEdgeLength);
    
    // Neues Bild ausgeben
    imagejpeg ($Thumbnail, $Image, 80);     // "$Thumbnail, $Image, Zahl" --> Zahl = Qualität des Bildes
    imagedestroy ($Thumbnail);
    }
?>
Danke für euer Unterstützung / Hilfe!
 

Rakete

Nicht mehr ganz neu hier

AW: PHP - Thumbnail mit Bildpfad

Du kannst sowohl imagecreatefromjpeg() als auch imagejpeg() in "filename" einen Pfad übergeben. Wenn die beiden Pfade sich voneinander unterscheiden, hast du hinterher zwei Bilder an unterschiedlichen Orten ... ;)

Also muss sich auch dein Thumbnail-Skript selbst nicht zwangsläufig in einem Ordner deiner Galerie befinden.

Btw. die Funktion zum Kopieren einer Datei heißt:

PHP:
copy ( string $source, string $dest )
 

Fuehrwehrma

Noch nicht viel geschrieben

AW: PHP - Thumbnail mit Bildpfad

Danke für deine Antwort!

Wenn ich das jetzt richtig verstehe, dann kann man in imagecreatefromjpeg (), für $Image, resp. in imagejpeg(), für $Thumbnail, einen Pfad hinterlegen?

Oder andere Variante:

PHP:
copy (string $source, string $dest)
Mit dieser Funktion bleibt aber mein Thumbnail Script im Ordner (thumbs) und ich muss nur die Pfadangabe für $source und $dest hinterlegen?

PS: Entschuldig bitte meine Fragen, aber bin im moment, resp, in Zukunft bemüht, an php zu lernen.
 

Rakete

Nicht mehr ganz neu hier

AW: PHP - Thumbnail mit Bildpfad

Wenn ich das jetzt richtig verstehe, dann kann man in imagecreatefromjpeg (), für $Image, resp. in imagejpeg(), für $Thumbnail, einen Pfad hinterlegen?

Ja, hast du richtig verstanden.

PHP:
copy (string $source, string $dest)
Mit dieser Funktion bleibt aber mein Thumbnail Script im Ordner (thumbs) und ich muss nur die Pfadangabe für $source und $dest hinterlegen?

Die Funktion copy() kopiert einfach irgendeine Datei, die in $source angegeben wird, an den Ort der in $dest angegeben ist. Dies war als allgemeine Zusatzinfo gedacht.
Falls du das mit dem Kopieren beibehalten möchtest/musst, könntest du auf diese Weise kopieren bevor oder nachdem du skalierst.

Aber nötig ist es hier nicht, denn, wie gesagt, man kann der imagejpeg() Funktion sagen wo die Datei gespeichert werden soll.
 

Fuehrwehrma

Noch nicht viel geschrieben

AW: PHP - Thumbnail mit Bildpfad

Hallo nochmals

Entschuldig meine verspätete Antwort. Ich hatte bis jetzt noch keine zeit, um etwas zu schreiben (Feedbakc).

Ich habe jetzt bei imagecreatefromjpeg(), für $Image, und bei imagejpeg, für $Thumnail, Pfade angegeben (siehe Script). Nur funktioniert das nicht.
Theoretisch müsste ich von PHP eine Fehlermeldung bekommen, dass das Verzeichnis schreibgeschützt ist. Doch leider ist dem nicht so. :-(

PHP:
<?php

// PHP-Fehlermeldungen anzeigen --> Alle erzwingen
error_reporting (E_ALL);

// Pfadangabe für die Original Bild
$Image = 'images/';

// Pfadangabe für die Thumbnails
$Thumbnail = 'thumbs/';

// Funktionsaufruf
foreach (glob ("*.jpg") as $Image)
    {
    qThumb ($Image, 90);    // "$Image, Zahl" --> Zahl = Breite / Höhe des Bildes in Pixel
    }

// Funktion
function qThumb ($Image, $ThumbEdgeLength)
    {
    // Masse ermitteln
    $OriginalImagedInfo   = getimagesize ($Image);
    $OriginalImageWidth = $OriginalImagedInfo[0];
    $OriginalImageHight  = $OriginalImagedInfo[1];
    $OriginalEdgeLength = $OriginalImageWidth < $OriginalImageHight ? $OriginalImageWidth : $OriginalImageHight;

    // Temporäres Bild vom Original erzeugen
    $TempImage = imagecreatefromjpeg ($Image);
    
    // Neues Bild erstellen
    $NewImage = imagecreatetruecolor ($OriginalEdgeLength, $OriginalEdgeLength);
    
    // Originalbild in neues Bild einfügen
    if ($OriginalImageWidth > $OriginalImageHight)
        {
        imagecopy ($NewImage, $TempImage, 0, 0, round ($OriginalImageWidth-$OriginalEdgeLength) / 2, 0, $OriginalImageWidth, $OriginalImageHight);
        }
    else if ($OriginalImageWidth <= $OriginalImageHight)
    {
        imagecopy ($NewImage, $TempImage, 0, 0, 0, round ($OriginalImageHight-$OriginalEdgeLength) / 2, $OriginalImageWidth, $OriginalImageHight);
    }
    
    $Thumbnail = imagecreatetruecolor ($ThumbEdgeLength, $ThumbEdgeLength);
    imagecopyresampled ($Thumbnail, $NewImage, 0, 0, 0, 0, $ThumbEdgeLength, $ThumbEdgeLength, $OriginalEdgeLength, $OriginalEdgeLength);
    
    // Neues Bild ausgeben
    imagejpeg ($Thumbnail, $Image, 80);     // "$Thumbnail, $Image, Zahl" --> Zahl = Qualität des Bildes
    imagedestroy ($Thumbnail);
    }
?>
Danke für eure Hilfe!
 

netbandit

Aktives Mitglied

AW: PHP - Thumbnail mit Bildpfad

In Dein glob() müsste der Pfad zu den Bilder noch rein (glaube ich, keine Lust zu testen).

Der Funktion qThumb ist so nicht bekannt wo die Thumbnails hingespeichert werden sollen (Pfad) und wozu imagecopy und imagecopyresampled?
 

Rakete

Nicht mehr ganz neu hier

AW: PHP - Thumbnail mit Bildpfad

Setz dich mal etwas intensiver mit dem Thema Variablen auseinander, insbesondere was der Unterschied zwischen globalen und lokalen Variablen ist, und vergebe die Namen sorgfältiger.

PHP: Hypertext Preprocessor

Oben in deinem Skript ist $Thumbnail eine globale Variable vom Typ String mit einem Ordnernamen, in der Funktion wird eine lokale Variable $Thumbnail dann plötzlich als ein Bildobjekt eingeführt ...

Eine globale Variable steht nicht automatisch innerhalb deiner Funktion zur Verfügung (eine lokale Variable steht niemals außerhalb der Funktion zur Verfügung, in der sie deklariert wurde).

Und würde die globale Variable $Thumbnail in deiner Funktion zur Verfügung stehen, hättest du sie mit der Deklaration des Bildobjekts überschrieben und dein Pfad befände sich im Nirwana ...

Das Gleiche gilt auch für $Image

Den Einwand von netbandit teile ich ebenfalls, wozu erstellst du das Ausgangsbild neu (imagecopy)? Das war doch schon da?! Eine schlichte Kopie der Datei kannst du, wie gesagt, mit copy() machen.


Btw. Das englische Wort für Höhe schreibt sich 'height' und nicht 'hight' :p ;)
 

Fuehrwehrma

Noch nicht viel geschrieben

AW: PHP - Thumbnail mit Bildpfad

Kurze erklärung meines Scripts:

- Mit $TembImage erstelle ich vom Original eine Kopie
- Mit $NewImage erstelle ich ein neues leeres Bild
- Mit diesem Code:
PHP:
    if ($OriginalImageWidth > $OriginalImageHight)
        {
        imagecopy ($NewImage, $TempImage, 0, 0, round ($OriginalImageWidth-$OriginalEdgeLength) / 2, 0, $OriginalImageWidth, $OriginalImageHight);
        }
    else if ($OriginalImageWidth <= $OriginalImageHight)
    {
        imagecopy ($NewImage, $TempImage, 0, 0, 0, round ($OriginalImageHight-$OriginalEdgeLength) / 2, $OriginalImageWidth, $OriginalImageHight);
    }
kopiere ich die Kopie vom Original ($TempImage) in das neue leere Bild ($NewImage). Mit 'if' resp. 'else if' definiere ich das Verhältnis, dass das Bild zentriert wird und dass beide Bildkanten die gleichen Pixel haben (quadratisch).

- Und mit imagecopyresampled ereiche ich, dass das quadratische Bild verkleinert wird.

Hoffe, dass ihr jetzt das nachvollziehen könnt, wieso das ich imagecopy und imagecopyresapled verwendet habe.

Wenn es noch einfacher geht, dann sagt es mir bitte!
Danke!

--> Rakete: Habe ich unterdessen auch schon bemerkt (hight -> height). :D
Aber Danke für deinen Hinweis.
 

netbandit

Aktives Mitglied

AW: PHP - Thumbnail mit Bildpfad

Hab mal ein wenig gebastelt, sollte funktionieren
PHP:
<?php

// PHP-Fehlermeldungen anzeigen --> Alle erzwingen
error_reporting (E_ALL);

// Pfadangabe für die Original Bilder
$Image_Path = 'images/';

// Pfadangabe für die Thumbnails
$Thumbnail_Path = 'thumbs/';

// Funktionsaufruf
foreach (glob ($Image_Path . "*.jpg") as $Image)
    {
    qThumb ($Image, $Thumbnail_Path, 90);    // "$Image, Pfadangabe für die Thumbnails,  Zahl = Breite / Höhe des Bildes in Pixel
}

// Funktion
function qThumb ($Image, $Thumbnail_Path, $ThumbEdgeLength)
    {
    // Masse ermitteln
    $OriginalImagedInfo   = getimagesize ($Image);
    $OriginalImageWidth = $OriginalImagedInfo[0];
    $OriginalImageHeight  = $OriginalImagedInfo[1];

    $PWidth=  100/$OriginalImageWidth*$ThumbEdgeLength; // Breite in Prozent des Endbildes bestimmen
    $PHeight=  100/$OriginalImageHeight*$ThumbEdgeLength; // Höhe in Prozent des Endbildes bestimmen

    $PosTop=0;
    $PosLeft=0;
    $BGC_RGB=array();
    
    if($PHeight<100 || $PWidth<100) 
        {
        // Mindesten 1 Seite ist größer als zugelassen
        if($PHeight<$PWidth)
            {
            $ThumbnailImageHeight = round($OriginalImageHeight/100*$PWidth);
            $ThumbnailImageWidth = $ThumbEdgeLength;
            $PosTop=round(($ThumbEdgeLength-$ThumbnailImageHeight)/2);
        }
        elseif($PHeight>$PWidth)
            {
            $ThumbnailImageWidth = round($OriginalImageWidth/100*$PHeight);
            $ThumbnailImageHeight = $ThumbEdgeLength;
            $PosLeft=round(($ThumbEdgeLength-$ThumbnailImageWidth)/2);
        }
        else
            {
            $ThumbnailImageHeight = $ThumbEdgeLength;
            $ThumbnailImageWidth = $ThumbEdgeLength;
        }
    }
    else
        {
        $ThumbnailImageHeight = $OriginalImageHeight;
        $ThumbnailImageWidth = $OriginalImageWidth;
        $PosLeft=round(($ThumbEdgeLength-$ThumbnailImageWidth)/2);
        $PosTop=round(($ThumbEdgeLength-$ThumbnailImageHeight)/2);
        
        if($PHeight>100 || $PWidth>100) 
            {
            // Hintergrundfarbe zum Auffüllen bestimmen da das OriginalBild kleiner ist (RGB)
            $BGC_RGB[0]=255;
            $BGC_RGB[1]=255;
            $BGC_RGB[2]=255;
            // Alle 3 Werte = 0 -> schwarz, Werte = 255 -> weiss
        }
    }
    // Temporäres Bild vom Original erzeugen
    $TempImage = imagecreatefromjpeg ($Image);

    // Neues Bild erstellen
    $Thumbnail = imagecreatetruecolor ($ThumbEdgeLength, $ThumbEdgeLength);
    
    if(count($BGC_RGB)==3)
        {
        // Hintergund einfärben
        $BGColor=ImageColorAllocate ($Thumbnail, $BGC_RGB[0], $BGC_RGB[1], $BGC_RGB[2]);
        imagefill($Thumbnail,0,0,$BGColor);
    }

    ImageCopyResampled($Thumbnail, $TempImage, $PosLeft, $PosTop, 0, 0, $ThumbnailImageWidth, $ThumbnailImageHeight, $OriginalImageWidth, $OriginalImageHeight);

    // Neues Bild ausgeben
    imagejpeg ($Thumbnail, $Thumbnail_Path . basename($Image), 80);     // "$Thumbnail, Zielpfad, Zahl = Qualität des Bildes
    imagedestroy ($Thumbnail);
}
?>
Grundsätzlich solltest Du das aber nicht machen, wenn zu viele Grafiken bearbeitet werden müssen. Ist sehr Serverlastig. Kannst das ja mal in 2-5er Schritten ausprobieren und mal darauf achten wie sich der Server verhält (Geschwindigkeit) ;)
 
Zuletzt bearbeitet:

netbandit

Aktives Mitglied

AW: PHP - Thumbnail mit Bildpfad

" if(count($BGC_RGB)==3) " warum = 3?
Standardm. ist $BGC_RGB ein Array ohne Inhalte, also count(BGC_RGB)==0

PHP:
...
    $PosLeft=0;
    $BGC_RGB=array();
    
    if($PHeight<100 || $PWidth<100) 
        {
...
Wurden 3 Farben (RGB) angelegt wird aufgefüllt.

PHP:
...
        if($PHeight>100 || $PWidth>100) 
            {
            // Hintergrundfarbe zum Auffüllen bestimmen da das OriginalBild kleiner ist (RGB)
            $BGC_RGB[0]=255;
            $BGC_RGB[1]=255;
            $BGC_RGB[2]=255;
            // Alle 3 Werte = 0 -> schwarz, Werte = 255 -> weiss
        }
...
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.564
Beiträge
1.538.064
Mitglieder
67.487
Neuestes Mitglied
MichaelSEivy
Oben