Hallo,
ich habe mich jetzt an der on-the-fly-Verkleinerung von Grafiken mittels PHP versucht, wohl aber noch einige Fehler fabriziert, weil mir keine verkleinerte Grafik angezeigt wird.
Ein fertiges Framework wollte ich nicht einbinden, weil ich ansonsten ja keinen Lerneffekt habe.
Hier die Testdatei, die eine vorhandene Grafik verkleinern soll:
$Grafik = "../IMG/FotoEnricoGross.png";
echo '<img src="INC/Verkleinern.php?G=' . $Grafik . '&B=100">';
Und hier die Datei "Verkleinern.php", die die Verkleinerung bewerkstelligen soll:
if (empty ($_GET))
return 'Die Servervariable "GET" ist leer';
if (!isset ($_GET["A"]))
return "Du hast keine Datei angegeben";
$Ausgangsgrafik = $_GET["A"];
if (!file_exists ($Ausgangsgrafik))
return 'Die Datei "' . $Ausgangsgrafik . '" wurde nicht gefunden';
if (strtolower (pathinfo ($Ausgangsgrafik, PATHINFO_EXTENSION)) != "png")
return 'Die Grafik "' . $Ausgangsgrafik . '" ist keine png-Datei';
if (!isset ($_GET["B"]) && !isset ($_GET["H"]))
return 'Die Angabe für die neue Breite oder Höhe fehlt';
if (isset ($_GET["B"]))
$Maximale_Breite = $_GET["B"];
if (!((int)$Maximale_Breite === $Maximale_Breite))
return 'Die Angabe "' . $Maximale_Breite . '" für die neue Breite ist keine Zahl';
if ($Maximale_Breite <= 0)
return 'Die Angabe für die neue Breite muss größer "0" sein';
if (isset ($_GET["H"]))
$Maximale_Hoehe = $_GET["H"];
if (!((int)$Maximale_Hoehe === $Maximale_Hoehe))
return 'Die Angabe "' . $Maximale_Hoehe . '" für die neue Höhe ist keine Zahl';
if ($Maximale_Hoehe <= 0)
return 'Die Angabe für die neue Höhe muss größer "0" sein';
if ($Maximale_Breite && $Maximale_Hoehe)
return "Es wird nur eine Angabe für die neue Breite oder Höhe benötigt";
$Kopie = imagecreatefromstring (Bytes_einlesen ($Ausgangsgrafik));
$Urspruengliche_Breite = imagesx ($Kopie);
$Urspruengliche_Hoehe = imagesy ($Kopie);
if ($Maximale_Breite)
$Faktor = $Maximale_Hoehe / $Urspruengliche_Hoehe;
else
if ($Maximale_Hoehe)
$Faktor = $Maximale_Breite / $Urspruengliche_Breite;
$Neue_Breite = round ($Urspruengliche_Breite * $Faktor);
$Neue_Hoehe = round ($Urspruengliche_Hoehe * $Faktor);
$Kopie = imagecreatefrompng ($Ausgangsgrafik);
$Verkleinerte_Kopie = imagecreatetruecolor ($Neue_Breite, $Neue_Hoehe);
$Transparenz = imagecolortransparent ($Kopie);
if ($Transparenz != -1)
{
$Transparente_Farbe = imagecolorsforindex ($Kopie, $Transparenz);
$Transparenz = imagecolorallocate ($Verkleinerte_Kopie, $Transparente_Farbe["red"], $Transparente_Farbe["green"], $Transparente_Farbe["blue"]);
imagefill ($Verkleinerte_Kopie, 0, 0, $Transparenz);
imagecolortransparent ($Verkleinerte_Kopie, $Transparenz);
}
else
{
imagealphablending ($Verkleinerte_Kopie, false);
$Alpha = imagecolorallocatealpha ($Verkleinerte_Kopie, 0, 0, 0, 127);
imagefill ($Verkleinerte_Kopie, 0, 0, $Alpha);
imagesavealpha ($Verkleinerte_Kopie, true);
}
imagecopyresampled ($Verkleinerte_Kopie, $Kopie, 0, 0, 0, 0, $Neue_Breite, $Neue_Hoehe, $Urspruengliche_Breite, $Urspruengliche_Hoehe);
header ("Content-type: IMAGETYPE_PNG");
imagepng ($Verkleinerte_Kopie, null);
function Bytes_einlesen ($url)
{
$curl = curl_init ($url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Range: bytes=0-32768"));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
Die Funktion "Bytes_einlesen" soll lediglich die Rohdaten der Ausgangsgrafik einlesen, so dass die Grafik nicht zuerst vollständig geladen werden muss, um deren Höhe und Breite zu ermitteln.
Ich dachte zunächst an einen Fehler bzgl. der Pfadangabe der Ausgangsgrafik.
Sie existiert, relativ zur aufrufenden Datei. Für den Fall, dass die verkleinernde PHP-Datei vom Ordner "INC" ausgehend auf die Grafik zugreifen sollte, habe ich einen weiteren Verzeichnungssprung zurück festgelegt ("../IMG/FotoEnricoGross.png"), aber mit dem selben Resultat, dass mir im Browser nur ein Symbol angezeigt wird, das wohl fehlerhaft geladene Grafiken symbolisieren soll.
Könnt ihr mir bitte helfen, dass ich mein Skript funktionstüchtig zum Laufen bringe?
Und übt bitte Nachsicht, sollten euch bei meinem Code die Haare zu Berge stehen.
Kann man Code jetzt gar nicht mehr farblich hervorheben lassen, so wie es im "alten" Forum war?
Irgendwie war ich zu blöd, hier auch nur annähernd eine strukturierte Ausgabe hinzubekommen ^^
Sorry dafür...
Vielen lieben Dank und Gruß,
Enrico