Files
4G/thumbnail.php

401 lines
14 KiB
PHP
Executable File

<?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 z.B. (string) "50%" wird diese umgerechnet
// $full muss 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;
}
}
?>