Hier ist der PHP code:
<?php
include_once("../../thumbnail.php");
$thumbnail = new thumbnail();
$thumbnail->create("1600.jpg");
$thumbnail->setQuality(97);
$thumbnail->resize(800);
$thumbnail->output();
?>
für das Erstellen der verkleinerten Bilder.
Und das ist der Code für die Klasse:
<?php
class thumbnail
{
var $img;
var $fileInfo;
var $fullName;
var $newX;
var $newY;
var $quality;
var $orgX;
var $orgY;
// $data - (voller) Dateiname oder String (z.B. aus Datenbank)
function create($data)
{
$this->destroy();
if (file_exists($data)) {
$this->img = @ImageCreateFromJpeg($data);
$this->fileInfo = basename($data);
$this->fullName = $data;
} else {
$this->img = @ImageCreateFromString($data);
}
if (!$this->img) {
$this->destroy();
return false;
} else {
$this->orgX = ImageSX($this->img);
$this->orgY = ImageSY($this->img);
return true;
}
}
// Höhe des aktuellen Bildes im Container zurückgeben, false bei Fehler
function height()
{
if ($this->img) {
return ImageSY($this->img);
} else {
return false;
}
}
// Breite des aktuellen Bildes im Container zurückgeben, false bei Fehler
function width()
{
if ($this->img) {
return ImageSX($this->img);
} else {
return false;
}
}
// Qualität für Ausgabe setzen
function setQuality($quality = false)
{
if ($this->img && $quality) {
$this->quality = $quality;
} else {
return false;
}
}
// Thumbnail erzeugen
function resize($newX = false,$newY = false)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
$newX = $this->_convert($newX,$X);
$newY = $this->_convert($newY,$Y);
if (!$newX && !$newY) {
$newX = $X;
$newY = $Y;
}
if (!$newX) {
$newX = round($X / ($Y / $newY));
}
if (!$newY) {
$newY = round($Y / ( $X / $newX));
}
if ( ! $newimg = ImageCreateTruecolor($newX,$newY)) {
$newimg = ImageCreate($newX,$newY);
}
if ( ! ImageCopyResampled ($newimg, $this->img, 0, 0, 0, 0, $newX, $newY,$X,$Y)) {
ImageCopyResized ($newimg, $this->img, 0, 0, 0, 0, $newX, $newY,$X,$Y);
}
$this->img = $newimg;
return true;
} else {
return false;
}
}
// Schneidet ein Bild neu zu
/* Werte für cut (X stellt das Ergebnis dar)
$srcX
+---+--------------+
$srcY | | |
+---+---+ |
| | X | $newY | Ursprungsbild
| +---+ |
| $newX |
| |
+------------------+
*/
function cut($newX,$newY,$srcX = 0,$srcY = 0)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
$newX = $this->_convert($newX,$X);
$newY = $this->_convert($newY,$Y);
if (!$newX) {
$newX = $X;
}
if (!$newY) {
$newY = $Y;
}
if ( ! $newimg = ImageCreateTruecolor($X,$Y)) {
$newimg = ImageCreate($X,$Y);
}
ImageCopy ($newimg,$this->img,0, 0, 0, 0,$X,$Y);
ImageDestroy($this->img);
if ( ! $this->img = ImageCreateTruecolor($newX, $newY)) {
$this->img = ImageCreate($newX, $newY);
}
imagecopy ($this->img,$newimg, 0, 0,$srcX, $srcY, $newX, $newY);
ImageDestroy($newimg);
return true;
} else {
return false;
}
}
/* schneidet ein Teil mit Größe newX und newY an festgelegten Stellen des Bildes zu
$pos = Position welches Teil verwendet werden soll
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+
*/
function autocut($newX,$newY,$pos = 5)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
$newX = $this->_convert($newX,$X);
$newY = $this->_convert($newY,$Y);
if (!$newX) {
$newX = $X;
}
if (!$newY) {
$newY = $Y;
}
switch ($pos) {
case 1:
$srcX = 0;
$srcY = 0;
break;
case 2:
$srcX = round(($X / 2)-($newX/2));
$srcY = 0;
break;
case 3:
$srcX = ImageSX($this->img) - $newX;
$srcY = 0;
break;
case 4:
$srcX = 0;
$srcY = round(($Y / 2)-($newY/2));
break;
case 5:
$srcX = round(($X / 2)-($newX/2));
$srcY = round(($Y / 2)-($newY/2));
break;
case 6:
$srcX = $X-$newX;
$srcY = round(($Y / 2)-($newY/2));
break;
case 7:
$srcX = 0;
$srcY = $Y - $newY;
break;
case 8:
$srcX = round(($X / 2)-($newX/2));
$srcY = $Y-$newY;
break;
case 9:
$srcX = $X- $newX;
$srcY = $Y - $newY;
break;
default:
$srcX = round(($X / 2)-($newX/2));
$srcY = round(($Y / 2)-($newY/2));
}
return $this->cut($newX,$newY,$srcX,$srcY);
} else {
return false;
}
}
// erzeugt ein Quadrat des Bildes mit Kantenlänge von $size
// ist das Bild nicht quadratisch kann mit $pos
// der Bildausschnitt festgelegt werden, Werte siehe function autocut
function cube($size,$pos = 5)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
if ($X > $Y)
{
$newX = false;
$newY = $size;
} elseif ($X < $Y) {
$newX = $size;
$newY = false;
} else {
$newX = $size;
$newY = $size;
}
if ($this->resize($newX,$newY)) {
return $this->autocut($size,$size,$pos);
} else {
return false;
}
} else {
return false;
}
}
// erzeugt ein Bild dessen größte Kantenlänge $size ist
function maxSize($size)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
if ($X > $Y)
{
$newX = $size;
$newY = false;
} elseif ($X < $Y) {
$newX = false;
$newY = $size;
} else {
$newX = $size;
$newY = $size;
}
return $this->resize($newX,$newY);
} else {
return false;
}
}
// erzeugt ein Bild dessen kleinste Kantenlänge $size ist
function minSize($size)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
if ($X > $Y)
{
$newX = false;
$newY = $size;
} elseif ($X < $Y) {
$newX = $size;
$newY = false;
} else {
$newX = $size;
$newY = $size;
}
return $this->resize($newX,$newY);
} else {
return false;
}
}
// speichert das Bild als $fileName
// wird $filename angegeben muss es ein voller Dateiname mit Pfad sein
// ist $override wahr wird ein bestehendes Bild überschrieben, sonst nicht
// Rückgabe:
// true wenn geschrieben (oder überschrieben)
// false on error
// 0 wenn schon existiert (nur bei $override=false)
function save($fileName, $override = true)
{
if ($this->img) {
if (!file_exists($fileName) || $override) {
if (ImageJPEG($this->img,$fileName,$this->quality)) {
return true;
} else {
return false;
}
} else {
return 0;
}
} else {
return false;
}
}
// Gibt Bild an Browser aus (Ausgabe des Headers, Destroy aufrufen), beide optional
function output($sendHeader = true,$destroy = true)
{
if ($this->img) {
if ($sendHeader) {
header("Content-type: image/jpeg");
}
ImageJPEG($this->img,"",$this->quality);
if ($destroy) {
$this->destroy();
}
} else {
return false;
}
}
// Setzt die Werte in der Klasse frei und löscht Bild
function destroy()
{
if ($this->img) {
ImageDestroy($this->img);
}
$this->img = false;
$this->fileInfo = false;
$this->fullName = false;
$this->newX = false;
$this->newY = false;
$this->quality = 70;
$this->orgX = false;
$this->orgY = false;
}
// rechnet prozentuale Angaben in Pixel um, erwartet
// ist $value eine Prozentangabe $full als 100% in Pixel angegeben werden
function _convert($value,$full = false)
{
if (strstr($value,"%")) {
$value = trim(str_replace ("%", "", $value));
$value = ($full / 100) * $value;
}
if ($value < 1 && $value !== false) {
$value = 1;
}
return $value;
}
}
?>
Was meinst du mit Endlosschleife?
Übrigens meine ich mit dem "Erstellen von Ordnern" nicht auf dem PC sondern auf dem Web Server, oder gibt es da auch so was wie Arbeitsspeicher?