<?php
ob_start();
clearstatcache();
@ini_set("max_execution_time", 300);
/*
Pixlie ist Donationware und wird unter der MIT Lizenz zur Verfuegung gestellt.
Donationware:
Bei der Donationware (von engl. "donation": Spende) handelt es sich um kostenlose
Software, wobei der Autor um eine Spende in beliebiger Hoehe bittet, um die durch
Weiterentwicklung oder Verbreitung der Software entstehenden Kosten zu
kompensieren (zum Beispiel Server-Kosten).
Wenn das eingesetzte Programm die Erwartungen erfuellt, und man es regelmaessig
im Einsatz hat, solle man eine dementsprechende Verguetung in Erwaegung ziehen.
MIT Lizenz (Deutsche Uebersetzung)
Copyright (c) 2008 Steffen Hagdorn
Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software
und der zugehoerigen Dokumentationen (die "Software") erhaelt, die Erlaubnis
erteilt, uneingeschraenkt zu benutzen, inklusive und ohne Ausnahme, dem Recht,
sie zu verwenden, kopieren, aendern, fusionieren, verlegen, verbreiten,
unterlizenzieren und/oder zu verkaufen, und Personen, die diese Software
erhalten, diese Rechte zu geben, unter den folgenden Bedingungen:
Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in alle
Kopien oder Teilkopien der Software beizulegen.
DIE SOFTWARE WIRD OHNE JEDE AUSDRUeCKLICHE ODER IMPLIZIERTE GARANTIE
BEREITGESTELLT, EINSCHIESSLICH DER GARANTIE ZUR BENUTZUNG FUeR DEN
VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER
RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRAeNKT. IN KEINEM
FALL SIND DIE AUTOREN ODER COPYRIGHTINHABER FUeR JEGLICHEN SCHADEN
ODER SONSTIGE ANSPRUCH HAFTBAR ZU MACHEN, OB INFOLGE DER ERFUeLLUNG
VON EINEM VERTRAG, EINEM DELIKT ODER ANDERS IM ZUSAMMENHANG MIT
DER BENUTZUNG ODER SONSTIGE VERWENDUNG DER SOFTWARE ENTSTANDEN.
Inhalt / Aufbau:
------------------------------------------------------
1. Konfiguration
- 1.1 Bildgroessen
- 1.2 Sortierung
- 1.3 Sonstige Einstellungen
- 1.4 Systemkonfiguration
2. Sprachausgaben
3. Fehlerbehandlung
4. Umgebungs- und Installationspruefung
5. Entgegennehmen der Query-Variable
6. Auf Hackerangriffe pruefen
7. Umwandlung in UTF-8
8. Verarbeitung eine Fotos
- 8.1 Angeforderte Bildgroesse der Query Variable pruefen
- 8.2 Cache Dateinamen und Dateipfade generieren
- 8.3 Pruefen ob Datei schon im Cache liegt
- 8.3.1 Berechne Bilder nach dem Typ "cut"
- 8.3.2 Berechne Bilder nach dem Typ "uncut"
- 8.3.3 Berechne Bilder nach dem Typ "bestfit"
- 8.4 Ausgabe des Bildes
9. Verarbeitung eines Ordners
- 9.1 Weiche f¸r Ordner / Bild
- 9.2 JPG Grunddaten lesen
- 9.3 IPTC Metadaten lesen
- 9.4 EXIF Metadaten lesen
- 9.5 Ordner Grunddaten lesen
- 9.6 Sortierung der Datentabellen
- 9.7 Ausgabe via JSON
*************************************************************************************************
*************************************** 1. Konfiguration ****************************************
*************************************************************************************************
**************************************** 1.1 Bildgroessen *****************************************
Vordefinierte Standardbildgroessen:
s = small | cut | 75/75
t = thumbnail | uncut | max 100
m = medium | uncut | max 240
d = default | uncut | max 500 (default)
b = big | uncut | max 1024
o = original | none | original
Unterschied "cut" und "uncut":
Wird der Bildberechnungstyp "cut" verwendet, wird das Bild auf eine feste Hoehe und Breite
aus dem Originalbild ohne verzerren ausgeschnitten. Hierfuer die Groesse in Form
von "hoehe/breite" angegeben. Beispiel: Einstellung 100/50 | Originalbild 400/800 = Ausgabe 100/50
Beim Bildberechnungstyp "uncut" wird das Bild unter beibehaltung der Seitenlaengen auf die
gewuenschte Groesse angepasst. Es muss nur der Wert angegeben werden, wie lange eine Seitenlaenge
maximal sein darf. Beispiel: Einstellung 100 | Originalbild 400/800 = Ausgabe 50/100
Benutzung 'overwrite_cache':
Zum Testen ist es sinnvoll 'overwrite_cache' auf 'on' zu stellen. Bei jedem Seitenaufruf wird der
Cache wieder mit neuen Daten ueberschrieben! Diese Option ist unter 1.3 (Sonstige Einstellungen)
zu finden.
HINWEIS: DASS DER CACHE GENUTZT WIRD, MUSS DIESE EINSTELLUNG IM LIVE-BETRIEB WIEDER AUF 'off' STEHEN!
Frei definierbare Bildgroessen:
Nachfolgend koennen beliebig viele eigene Bildgroessen definiert werden. Die Bildabkuerzung s,t,m,d,b und o
sind schon vorbelegt! Das Kuerzel des Bildtyps darf nur ein Zeichen sein!
LEERE DEN CACHE-ORDER NACH DEM AeNDERN DIESER WERTE ODER VERWENDE 'overwrite_cache'!*/
$pixlie_imageconfig = array(
'x' => array('type'=>'cut','size'=>'80,80'), //Beispiel fuer Zugeschnittenes Bild mit 120 x 90 Pixel
'y' => array('type'=>'uncut','size'=>'600'), //Beispiel fuer ein in der Groesse angepasstes Bild mit max 600 Pixel
'z' => array('type'=>'bestfit','size'=>'900,600') //Beispiel fuer ein in der Groesse angepasstes Bild mit max 900 x 600 Pixel, wobei die H?he dem zweiten Wert angepasst wird. Hochformat = H?he von Querformat. M?glich ist auch nur eine Gr?flenangabe.
);
/**************************************** 1.2 Sortierung ****************************************
Beispiele fuer die Sortierung:
1. Sortiere zuerst absteigend nach dem Hochladezeitpunkt, danach absteigend nach dem Speicherdatum
des Originalfotos. Behandle beide Datumsangaben als Zahlen.
first: ctime, SORT_DESC, SORT_NUMERIC
second: mtime, SORT_DESC, SORT_NUMERIC
2. Sortiere zuerst aufsteigend nach dem Dateinamen, danach absteigend nach dem IPTC Feld "Stadt".
Behandle beide Werte als Zeichenkette. Eine Liste der unterstuetzten IPTC Werte ist weiter unten
bei "$pixlie_iptc_codes" zu finden.
first: name , SORT_ASC, SORT_STRING
second: iptc_city, SORT_DESC, SORT_STRING
3. Sortiere zuerst absteigend nach dem EXIF-Datum, danach aufsteigend nach Name.
Behandle beide Werte als Zeichenkette. Das EXIF-Datum muss als String angegeben werden, da
es keine numerische Zahl ist.
first: exif_exif_datetimeoriginal, SORT_DESC, SORT_STRING
second: name, SORT_ASC, SORT_STRING
*/
$pixlie_sortconfig = array(
// name, ctime, mtime, atime oder jedes iptc bzw. exif Feld
'sort_file_first_row'=>"ctime",
// absteigend: SORT_DESC, aufsteigend: SORT_ASC
'sort_file_first_order'=>SORT_DESC,
// regul?r: SORT_REGULAR, numerisch: SORT_NUMERIC, alphanumerisch: SORT_STRING
// auf SORT_STRING setzen, wenn EXIF/IPTC Originaldatum (z.B. 'exif_exif_datetimeoriginal') verwendet wird
'sort_file_first_type'=>SORT_NUMERIC,
// name, ctime, mtime, atime oder jedes iptc bzw. exif Feld
'sort_file_second_row'=>'mtime',
// absteigend: SORT_DESC, aufsteigend: SORT_ASC
'sort_file_second_order'=>SORT_DESC,
// SORT_REGULAR, SORT_NUMERIC, SORT_STRING
'sort_file_second_type'=>SORT_NUMERIC,
// name, ctime, mtime, atime oder jedes iptc bzw. exif Feld
'sort_dir_first_row'=>'name',
// absteigend: SORT_DESC, aufsteigend: SORT_ASC
'sort_dir_first_order'=>SORT_ASC,
// SORT_REGULAR, SORT_NUMERIC, SORT_STRING
'sort_dir_first_type'=>SORT_STRING,
// name, ctime, mtime, atime oder jedes iptc bzw. exif Feld
'sort_dir_second_row'=>'ctime',
// absteigend: SORT_DESC, aufsteigend: SORT_ASC
'sort_dir_second_order'=>SORT_DESC,
// SORT_REGULAR, SORT_NUMERIC, SORT_STRING
'sort_dir_second_type'=>SORT_NUMERIC
);
/********************************** 1.3 Sonstige Einstellungen **********************************
WICHTIG: STELLEN SIE IM LIVE BETRIEB NACH DER ENTWICKLUNG 'overwrite_cache' AUF AUS!!!
Hinweis zu 'http_method': Viele Javascript Bibliotheken koennen Pixlie PATHINFO nicht umsetzen. */
$manual_subpath_var = 'bildpfad'; //Variable des manuellen Pfades
$pixlie_userconfig = array(
'overwrite_cache' => 'off', //Cache bei jedem Aufruf neu erstellen: on = an, off = aus
'pic_image_quality' => 90, //Bildqualitaet: 0 = schlechteste , 100 = beste
'show_metadata_iptc' => 'on', //IPTC-Ausgabe: on = an, off = aus
'show_metadata_exif' => 'on', //EXIF-Ausgabe: on = an, off = aus
'dir_cache' => dirname(__FILE__).'/cache', //Pfad zum Cache Verzeichnis
'dir_upload' => dirname(__FILE__).'/upload'.
((isset($manual_subpath)&&$manual_subpath!='')?'/'.$manual_subpath:((isset($_GET[$manual_subpath_var])&&$_GET[$manual_subpath_var]!='')?'/'.$_GET[$manual_subpath_var]:'')), //Pfad zum Upload Verzeichnis
'http_method' => 'GET', //Uebermittlungsmethode der Query-Variable: PATHINFO oder GET
'http_var_name' => 'q', //Name der Query-Variablen die per http_method uebergeben wird
'response_type' => 'php', //Art der Antwort: direkt = json, include = php
'relative_path' => '', //Ist Strato Dein Hoster oder sollten die automatisch generierten Pfade nicht stimmen, trage hier den relativen Pfad ohne abschlieflenden Slash zur pixlie.php ein (z.B. '/pixlie')
'use_dims' => false, //Wenn Du die Bildabmessungen in der Ausgabe ben?tigst, stelle diesen Wert auf true [ true | false ]. Standard: false
'use_origfilename_as_save' => false, //Originaldateinamen beim Speichern anbieten? [ true | false ]. Auf false stellen, wenn keine Lightbox verwendet wird, da sonst das Bild als Download angeboten und nicht direkt angezeigt wird.
);
//Namen der IPTC Felder in der Tabelle "$pixlie_table_file"
$pixlie_iptc_codes = array(
'2#005'=>'iptc_object_name', //Name des Objektes
'2#007'=>'iptc_edit_status', //Der Bearbeitungsstatus
'2#010'=>'iptc_priority', //Die Prioritaet
'2#015'=>'iptc_category', //Die Kategorie
'2#020'=>'iptc_supplemental_category', //Zusaetzliche Kategorien wenn vorhanden
'2#025'=>'iptc_keywords', //Keywoerter fuer die Suche
'2#030'=>'iptc_release_date', //Datum des Bildes
'2#035'=>'iptc_release_time', //Uhrzeit des Bildes
'2#040'=>'iptc_special_instructions', //Besondere Hinweise zu dem Bild
'2#045'=>'iptc_reference_service', //Referenzen auf den Bilderservice
'2#047'=>'iptc_reference_date', //Referenzen auf das Datum (Bildarchiv)
'2#050'=>'iptc_reference_number', //Referenznummer fuer die Identifikation
'2#055'=>'iptc_created_date', //Datum des Fotos
'2#060'=>'iptc_created_time', //Uhrzeit des Fotos
'2#062'=>'iptc_digital_creation_date', //Datum des Fotos
'2#063'=>'iptc_digital_creation_time', //Uhrzeit des Fotos
'2#065'=>'iptc_originating_program', //Programm mit dem das Foto erstellt wurde
'2#070'=>'iptc_program_version', //Version des Programms
'2#080'=>'iptc_byline', //Name des Autors (Fotografen)
'2#085'=>'iptc_byline_title', //Titel des Fotografen
'2#090'=>'iptc_city', //Stadt
'2#092'=>'iptc_sublocation', //Lokation oder Ort
'2#095'=>'iptc_province_state', //Bundesland
'2#100'=>'iptc_country_code', //Laendercode nach [ISO 3166-1]
'2#101'=>'iptc_country', //Laendername
'2#105'=>'iptc_headline', //Titel des Fotos
'2#115'=>'iptc_source', //Quelle
'2#116'=>'iptc_copyright', //Copyright Text
'2#118'=>'iptc_contact', //Internetadresse
'2#120'=>'iptc_caption', //Beschreibung
'2#122'=>'iptc_caption_writer', //Autor der Beschreibung
'2#150'=>'iptc_content_preview', //Vorschau
'2#200'=>'iptc_custom_field_01', //Frei verwendbare Textfelder
'2#201'=>'iptc_custom_field_02', //Frei verwendbare Textfelder
'2#202'=>'iptc_custom_field_03', //Frei verwendbare Textfelder
'2#203'=>'iptc_custom_field_04', //Frei verwendbare Textfelder
'2#204'=>'iptc_custom_field_05', //Frei verwendbare Textfelder
'2#205'=>'iptc_custom_field_06', //Frei verwendbare Textfelder
'2#206'=>'iptc_custom_field_07', //Frei verwendbare Textfelder
'2#207'=>'iptc_custom_field_08', //Frei verwendbare Textfelder
'2#208'=>'iptc_custom_field_09', //Frei verwendbare Textfelder
'2#209'=>'iptc_custom_field_10', //Frei verwendbare Textfelder
'2#210'=>'iptc_custom_field_11', //Frei verwendbare Textfelder
'2#211'=>'iptc_custom_field_12', //Frei verwendbare Textfelder
'2#212'=>'iptc_custom_field_13', //Frei verwendbare Textfelder
'2#213'=>'iptc_custom_field_14', //Frei verwendbare Textfelder
'2#214'=>'iptc_custom_field_15', //Frei verwendbare Textfelder
'2#215'=>'iptc_custom_field_16', //Frei verwendbare Textfelder
'2#216'=>'iptc_custom_field_17', //Frei verwendbare Textfelder
'2#217'=>'iptc_custom_field_18', //Frei verwendbare Textfelder
'2#218'=>'iptc_custom_field_19', //Frei verwendbare Textfelder
'2#219'=>'iptc_custom_field_20', //Frei verwendbare Textfelder
'2#230'=>'iptc_document_notes', //Hinweise zu dem Dokument
'2#231'=>'iptc_document_history', //Historie des Dokumentes
'2#232'=>'iptc_exif_camera_info' //Binaere EXIF Kameradaten (nicht editierbar)
);
/*********************************** 1.4 Systemkonfiguration*************************************/
$pixlie_sysconfig = array(
'php_req_vers' => '4.0.0', //erforderliche PHP Version
'manual_subpath_var' => $manual_subpath_var //manuelle Pfad. Wird automatisch ¸bernommen.
);
/* Bitte aender diese Standardtisierten Bildwerte nicht. Eigene koennen weiter oben unter dem
Punkt 1.1 (Bildgroessen) erstellt werden. */
$pixlie_sys_imageconfig = array(
's' => array('type'=>'cut', 'size'=>'75,75'),
't' => array('type'=>'uncut','size'=>'100'),
'm' => array('type'=>'uncut','size'=>'240'),
'd' => array('type'=>'uncut','size'=>'500'),
'b' => array('type'=>'uncut','size'=>'1024'),
'o' => array('type'=>'none', 'size'=>'original'),
);
$pixlie_image_sizes = array_merge($pixlie_sys_imageconfig,$pixlie_imageconfig);
$pixlie_config = array_merge($pixlie_userconfig,$pixlie_sortconfig,$pixlie_sysconfig);
// PHP Remote Config
if(isset($response_type)){
switch($response_type){
case 'php': $pixlie_config['response_type'] = 'php';
break;
case 'json': $pixlie_config['response_type'] = 'json';
break;}}
/*************************************** 2. Sprachausgaben **************************************/
$pixlie_lang = array(
'conf_cache_dir_read' => "Das Cache-Verzeichnis <b>".$pixlie_config['dir_cache']."</b> existiert nicht.",
'conf_cache_dir_write' => "Cache-Verzeichnis <b>".$pixlie_config['dir_cache']."</b> ok. Pixlie benoetigt jedoch schreibenden Zugriff auf das Cache-Verzeichnis. Bitte das Recht 777 auf das Cache-Verzeichnis setzen.",
'conf_upload_dir_read' => "Das Upload-Verzeichnis <b>".$pixlie_config['dir_upload']."</b> fuer die Bilder existiert nicht.",
'conf_upload_dir_write' => "Upload-Verzeichnis <b>".$pixlie_config['dir_upload']."</b> ok. Pixlie benoetigt jedoch lesenden Zugriff auf das Upload-Verzeichnis. Bitte das Recht 755 auf das Upload-Verzeichnis setzen.",
'conf_php_vers' => "Pixlie benoetigt mindestens PHP in der Version <b>".$pixlie_config['php_req_vers']."</b>.",
'conf_http_method' => "Der Wert http_method <b>(".$pixlie_config['http_method'].")</b> in der Config hat einen falschen Wert.",
'conf_xss_prot' => "Der XSS Schutz hat eine nicht gueltige Zeichenfolge in der Query erkannt.",
'pic_fileexists_false' => "Das angeforderte Bild existiert nicht.",
'pic_rendertype_false' => "Der hinterlegte Rendertyp existiert nicht.",
'dir_opendir_false' => "Das angeforderte Verzeichnis kann nicht gelesen werden.",
'exif_function_not_exist' => "Die Funktion <b>exif_read_data</b> konnte nicht gefunden werden. Bitte <b>show_metadata_exif</b> in der Pixlie-Konfiguration auf <b>'off'</b> stellen."
);
/************************************** 3. Fehlerbehandlung *************************************/
if(function_exists('pixlie_error')==false){
function pixlie_error($msg){
global $pixlie_config;
clearstatcache();
if ($pixlie_config['response_type'] == 'json') {
$pixlie_table_env['status'] = false;
$pixlie_table_env['errormsg'] = $msg;
die(json_encode(array('pixlie_table_env'=>$pixlie_table_env)));}
else{
die($msg);}}}
/***************************** 4. Umgebungs- und Installationspruefung ***************************/
// Windows oder *Nix
$bIsNix = (preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", __FILE__)) ? false : true;
//cache check
if(!(is_dir($pixlie_config['dir_cache']))) {
pixlie_error($pixlie_lang['conf_cache_dir_read']);}
elseif(!(is_readable($pixlie_config['dir_cache'])) || !(is_writable($pixlie_config['dir_cache'])) || ($bIsNix && !(is_executable($pixlie_config['dir_cache'])))) {
pixlie_error($pixlie_lang['conf_cache_dir_write']);}
//upload check
if(!(is_dir($pixlie_config['dir_upload']))) {
pixlie_error($pixlie_lang['conf_upload_dir_read']);}
elseif(!(is_readable($pixlie_config['dir_upload'])) || ($bIsNix && !(is_executable($pixlie_config['dir_upload'])))) {
pixlie_error($pixlie_lang['conf_upload_dir_write']);}
//PHP version-check
if( phpversion() < $pixlie_config['php_req_vers'] ){
pixlie_error($pixlie_lang['conf_php_vers']);}
/****************************** 5. Entgegennehmen der Query-Variable ****************************/
switch ($pixlie_config['http_method']){
case 'GET': if(isset($_GET[$pixlie_config['http_var_name']])){
$pixlie_query = $_GET[$pixlie_config['http_var_name']];}
else{
$pixlie_query = '';}
break;
case 'PATHINFO': if(isset($_SERVER['PATH_INFO'])){
$pixlie_query = $_SERVER['PATH_INFO'];}
else{
$pixlie_query = '';}
break;
default: pixlie_error($pixlie_lang['conf_http_method']);
break;}
/********************************* 6. Auf Hackerangriffe pruefen *********************************/
//cross-site scripting (XSS-Schutz)
$pixlie_query = preg_replace('/\.\./','',$pixlie_query);
$pixlie_query = preg_replace('/\/\//','/',$pixlie_query);
if ((preg_match("/<[^>]*script*\"?[^>]*>/", $pixlie_query)) ||
(preg_match("/<[^>]*object*\"?[^>]*>/", $pixlie_query)) ||
(preg_match("/<[^>]*iframe*\"?[^>]*>/", $pixlie_query)) ||
(preg_match("/<[^>]*applet*\"?[^>]*>/", $pixlie_query)) ||
(preg_match("/<[^>]*meta*\"?[^>]*>/", $pixlie_query)) ||
(preg_match("/<[^>]*style*\"?[^>]*>/", $pixlie_query)) ||
(preg_match("/<[^>]*form*\"?[^>]*>/", $pixlie_query)) ||
// (preg_match("/\([^>]*\"?[^)]*\)/", $pixlie_query)) || // auskommentiert, um Dateinamen mit Klammern zu erlauben
(preg_match("/\"/", $pixlie_query))) {
pixlie_error($pixlie_lang['conf_xss_prot']);die();}
/************************************ 7. Umwandlung in UTF-8 ************************************/
$pixlie_query = utf8_decode($pixlie_query);
/*************************************************************************************************
********************************* 8. Verarbeitung eines Fotos ***********************************
************************************************************************************************/
if(preg_match('/(.jpg)$/i', $pixlie_query)){
/********************** 8.1 Angeforderte Bildgroesse der Query Variable pruefen ********************/
if(false !== preg_match('/.*_(.)(\....)/',$pixlie_query,$pixlie_reg_picsize)){
$pixlie_item_picsize = $pixlie_reg_picsize[1];
$pixlie_item_extension = $pixlie_reg_picsize[2];
$pixlie_query = preg_replace('/_'.$pixlie_item_picsize.$pixlie_item_extension.'/' ,
$pixlie_item_extension,$pixlie_query);}
else{
$pixlie_item_picsize = 'd';}
/************************ 8.2 Cache Dateinamen und Dateipfade generieren ************************/
$pixlie_item_path = $pixlie_config['dir_upload'].$pixlie_query;
$pixlie_cache_name = md5($pixlie_query).'_'.$pixlie_item_picsize.'.jpg';
$pixlie_cache_path = $pixlie_config['dir_cache'].'/'.$pixlie_cache_name;
/*************************** 8.3 Pruefen ob Datei schon im Cache liegt ***************************/
if(file_exists($pixlie_item_path)){
if((file_exists($pixlie_cache_path)==false)||($pixlie_config['overwrite_cache']=='on')){
switch ($pixlie_image_sizes[$pixlie_item_picsize]['type']){
/*************************** 8.3.1 Berechne Bilder nach dem Typ "cut" ***************************/
case 'cut':
$pixlie_render_size = explode(',',$pixlie_image_sizes[$pixlie_item_picsize]['size']);
@ini_set('memory_limit', '50M');
$src_img = imagecreatefromjpeg($pixlie_item_path);
if((imagesy($src_img) / imagesx($src_img) * $pixlie_render_size[0]) >$pixlie_render_size[1] ){
$src_w = imagesx($src_img);
$src_h = round((imagesx($src_img)/$pixlie_render_size[0])*$pixlie_render_size[1]);
$src_x = (imagesy($src_img)-$src_h) / 4;
$src_y = 0;}
else{
$src_h = imagesy($src_img);
$src_w = round((imagesy($src_img)/$pixlie_render_size[1])*$pixlie_render_size[0]);
$src_y = (imagesx($src_img)-$src_w) / 2;
$src_x = 0;}
$dst_img = imagecreatetruecolor($pixlie_render_size[0],$pixlie_render_size[1]);
imagecopyresampled($dst_img,$src_img,0,0,$src_y,$src_x,$pixlie_render_size[0],
$pixlie_render_size[1],$src_w,$src_h);
imagedestroy($src_img);
imagejpeg($dst_img, $pixlie_cache_path, $pixlie_config['pic_image_quality']);
imagedestroy($dst_img);
break;
/************************** 8.3.2 Berechne Bilder nach dem Typ "uncut" **************************/
case 'uncut':
$pixlie_render_size = $pixlie_image_sizes[$pixlie_item_picsize]['size'];
@ini_set('memory_limit', '50M');
$src_img = imagecreatefromjpeg($pixlie_item_path);
if(imagesx($src_img)==imagesy($src_img)){
$dst_w = $pixlie_render_size;
$dst_h = $pixlie_render_size;}
elseif (imagesx($src_img) > imagesy($src_img)){
$dst_w = round( $pixlie_render_size / imagesx($src_img) * imagesy($src_img));
$dst_h = $pixlie_render_size;}
else{
$dst_w = $pixlie_render_size;
$dst_h = round($pixlie_render_size / imagesy($src_img) * imagesx($src_img));}
$dst_img = imagecreatetruecolor($dst_h,$dst_w);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$dst_h,$dst_w,imagesx($src_img),imagesy($src_img));
imagedestroy($src_img);
imagejpeg($dst_img, $pixlie_cache_path, $pixlie_config['pic_image_quality']);
imagedestroy($dst_img);
break;
/************************** 8.3.3 Berechne Bilder nach dem Typ "bestfit" ************************/
case 'bestfit':
if (strpos($pixlie_image_sizes[$pixlie_item_picsize]['size'],',')) {
$pixlie_render_size = explode(',',$pixlie_image_sizes[$pixlie_item_picsize]['size']);
} else {
$pixlie_render_size = array($pixlie_image_sizes[$pixlie_item_picsize]['size'],$pixlie_image_sizes[$pixlie_item_picsize]['size']);
}
@ini_set('memory_limit', '50M');
$src_img = imagecreatefromjpeg($pixlie_item_path);
// Ziel-Verh?ltnis aus H?he und Breite ermitteln
$relation = $pixlie_render_size[0]/$pixlie_render_size[1];
if(imagesx($src_img)==imagesy($src_img)){
// quadratisches Format: H?he und Breite auf den kleineren Wert setzen
$dst_w = min($pixlie_render_size[0],$pixlie_render_size[1]);
$dst_h = $dst_w;
} elseif (imagesx($src_img)/imagesy($src_img) == $relation ){
// Ziel-Verh?ltnis bereits vorhanden, Werte direkt ¸bernehmen
$dst_w = $pixlie_render_size[0];
$dst_h = $pixlie_render_size[1];
} elseif (imagesx($src_img)/imagesy($src_img) < $relation ){
// "hochformatiger" als Ziel-Verh?ltnis, H?he ¸bernehmen, Breite berechnen
$dst_w = round( $pixlie_render_size[1] * imagesx($src_img)/imagesy($src_img));
$dst_h = $pixlie_render_size[1];
} else {
// "querformatiger" als Ziel-Verh?ltnis, Breite ¸bernehmen, H?he berechnen
$dst_w = $pixlie_render_size[0];
$dst_h = round($pixlie_render_size[0] * imagesy($src_img)/imagesx($src_img));
}
$dst_img = imagecreatetruecolor($dst_w,$dst_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$dst_w,$dst_h,imagesx($src_img),imagesy($src_img));
imagedestroy($src_img);
if ( isset( $plugins['watermark_uncut'] ) && $plugins['watermark_uncut'] ) {
include( $global_config['pluginspath'].'/watermark/watermark.php' ); // Einbinden des Wasserzeichens
$dst_img = watermark( $dst_img, 'uncut' ); // Wasserzeichen einbrennen, wenn eingestellt
}
if ( isset( $plugins['unsharpmask_uncut'] ) && $plugins['unsharpmask_uncut'] ) {
include( $global_config['pluginspath'].'/unsharpmask/unsharpmask.php' ); // Einbinden des "Unscharf Maskieren" Filters
$dst_img = UnsharpMask( $dst_img, 80, 0.7, 1 ); // image res, amount, radius, threshold
}
imagejpeg($dst_img, $pixlie_cache_path, $pixlie_config['pic_image_quality']);
imagedestroy($dst_img);
break;
case 'none': $pixlie_cache_path = $pixlie_item_path;
break;
default: pixlie_error($pixlie_lang['pic_rendertype_false']);;
break;}}
/*********************************** 8.4 Ausgabe des Bildes *************************************/
$xFilename = explode('/', $pixlie_query);
$xFilesize = filesize($pixlie_cache_path);
header("Pragma: public");
header("Expires: " . gmdate('D, d M Y H:i:s', time()+ 30*24*60*60) . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: image/jpeg");
if ($pixlie_config['use_origfilename_as_save'])
header("Content-Disposition: attachment; filename=\"".utf8_decode($xFilename[count($xFilename)-1])."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$xFilesize);
ob_clean(); // Patch: http://pixlie.de/forum/index.php?page=Thread&postID=2344#post2344
readfile($pixlie_cache_path);
//imagejpeg(imagecreatefromjpeg($pixlie_cache_path)); //alternativ
}
else{
pixlie_error($pixlie_lang['pic_fileexists_false']);}}
else{
/*************************************************************************************************
******************************** 9. Verarbeitung eines Ordners **********************************
************************************************************************************************/
$pixlie_table_file = array();
$pixlie_table_dir = array();
$pixlie_table_env = array();
$pixlie_key_counter_file = 0;
$pixlie_key_counter_dir = 0;
if($pixlie_dir_handle = @opendir($pixlie_config['dir_upload'].$pixlie_query)){
/********************************** 9.1 Weiche f¸r Ordner / Bild *********************************/
while(false !== ($pixlie_item_name = readdir($pixlie_dir_handle))){
if ($pixlie_item_name != "." && $pixlie_item_name != "..") {
$pixlie_item_path = $pixlie_config['dir_upload'].$pixlie_query.'/'.$pixlie_item_name;
if((filetype($pixlie_item_path)=='file')&&(preg_match('/(.jpg)$/i', $pixlie_item_name))){
/************************************* 9.2 JPG Grunddaten lesen *********************************/
$pixlie_item_key = $pixlie_key_counter_file;
$pixlie_key_counter_file ++;
$pixlie_table_file[$pixlie_item_key]['name'] =
utf8_encode(preg_replace('/\.jpg/i','',$pixlie_item_name));
$pixlie_link_file = urlencode($pixlie_table_file[$pixlie_item_key]['name']);
$pixlie_link_query = preg_replace('/%2F/','/',urlencode(utf8_encode($pixlie_query)));
if($pixlie_query==''){
$pixlie_table_file[$pixlie_item_key]['link_get'] =
'?'.$pixlie_config['http_var_name'].'=/'.$pixlie_link_file;
$pixlie_table_file[$pixlie_item_key]['link_pathinfo'] =
'/'.$pixlie_link_file;}
else{
$pixlie_table_file[$pixlie_item_key]['link_get'] =
'?'.$pixlie_config['http_var_name'].'='.$pixlie_link_query.'/'.$pixlie_link_file;
$pixlie_table_file[$pixlie_item_key]['link_pathinfo'] =
$pixlie_link_query.'/'.$pixlie_link_file;}
$pixlie_table_file[$pixlie_item_key]['atime'] = fileatime($pixlie_item_path);
$pixlie_table_file[$pixlie_item_key]['ctime'] = filectime($pixlie_item_path);
$pixlie_table_file[$pixlie_item_key]['mtime'] = filemtime($pixlie_item_path);
$pixlie_table_file[$pixlie_item_key]['size'] = filesize($pixlie_item_path);
preg_match('/.*(\....)/',$pixlie_item_name,$pixlie_reg_extension);
$pixlie_table_file[$pixlie_item_key]['extension'] = $pixlie_reg_extension[1];
if ($pixlie_config['use_dims']) {
$aDims = getimagesize($pixlie_item_path, $iptc_info);
$pixlie_table_file[$pixlie_item_key]['width'] = $aDims[0];
$pixlie_table_file[$pixlie_item_key]['height'] = $aDims[1];
$pixlie_table_file[$pixlie_item_key]['html'] = $aDims[3];
}
/*********************************** 9.3 IPTC Metadaten lesen ***********************************/
if($pixlie_config['show_metadata_iptc']=='on'){
if (!$pixlie_config['use_dims'])
getimagesize($pixlie_item_path, $iptc_info);
if(isset($iptc_info["APP13"])){
$iptc_data = iptcparse($iptc_info["APP13"]);
if(is_array($iptc_data)) {
foreach ($iptc_data as $iptc_key => $iptc_value){
if($iptc_key != '2#000'){
if(count($iptc_value)>1){
$pixlie_table_file[$pixlie_item_key][$pixlie_iptc_codes[$iptc_key]] =
utf8_encode(implode(',',$iptc_value));}
else{
@$pixlie_table_file[$pixlie_item_key][$pixlie_iptc_codes[$iptc_key]] =
utf8_encode($iptc_value[0]); }}}}}}
/*********************************** 9.4 EXIF Metadaten lesen ***********************************/
if($pixlie_config['show_metadata_exif']=='on') {
if (function_exists('exif_read_data')) {
$exif_data = exif_read_data($pixlie_item_path ,1, true);
if($exif_data!=false){
foreach ($exif_data as $exif_key => $exif_section) {
if ((stristr($exif_key,'makernote')== false)) {
foreach ($exif_section as $exif_name => $exif_value) {
if((stristr($exif_name,'makernote')== false)&&(stristr($exif_name,'usercomment')== false)&&
(stristr($exif_name,'undefined')== false)){
$pixlie_table_file[$pixlie_item_key]['exif_'.strtolower($exif_key).'_'.
strtolower($exif_name)] = ((is_array($exif_value))?$exif_value:utf8_encode($exif_value)); }}}}} //$exif_value could be array
} else
pixlie_error($pixlie_lang['exif_function_not_exist']);
}} elseif(filetype($pixlie_item_path)=='dir'){
/*********************************** 9.5 Ordner Grunddaten lesen ********************************/
$pixlie_item_key = $pixlie_key_counter_dir;
$pixlie_key_counter_dir ++;
$pixlie_link_file = urlencode(utf8_encode($pixlie_item_name));
$pixlie_link_query = preg_replace('/%2F/','/',urlencode(utf8_encode($pixlie_query)));
if($pixlie_query==''){
$pixlie_table_dir[$pixlie_item_key]['link_get'] =
'?'.$pixlie_config['http_var_name'].'=/'.$pixlie_link_file;
$pixlie_table_dir[$pixlie_item_key]['link_pathinfo'] = '/'.$pixlie_link_file;}
else{
$pixlie_table_dir[$pixlie_item_key]['link_get'] =
'?'.$pixlie_config['http_var_name'].'='.$pixlie_link_query.'/'.$pixlie_link_file;
$pixlie_table_dir[$pixlie_item_key]['link_pathinfo'] =
$pixlie_link_query.'/'.$pixlie_link_file;}
$pixlie_table_dir[$pixlie_item_key]['name'] = utf8_encode($pixlie_item_name);
$pixlie_table_dir[$pixlie_item_key]['atime'] = fileatime($pixlie_item_path);
$pixlie_table_dir[$pixlie_item_key]['ctime'] = filectime($pixlie_item_path);
$pixlie_table_dir[$pixlie_item_key]['mtime'] = filemtime($pixlie_item_path);}}}
closedir($pixlie_dir_handle);
$pixlie_table_env['status'] = true;
$pixlie_table_env['numberof_file'] = count($pixlie_table_file);
$pixlie_table_env['numberof_dir'] = count($pixlie_table_dir);
$pixlie_table_env['query'] = utf8_encode($pixlie_query);
$__FILE__ = (substr($_SERVER["DOCUMENT_ROOT"], 0, strlen('/kunden')) == '/kunden') ? '/kunden'.__FILE__ : __FILE__; // 1&1 workaround
if ( $pixlie_config['relative_path'] != '' ) {
$relpath = $pixlie_config['relative_path'].((substr($pixlie_config['relative_path'], -1) != '/') ? '/' : '');
} else {
$fullpath = str_replace('\\', '/', dirname($__FILE__));
$fullpath = $fullpath.((substr($fullpath, -1) != '/') ? '/' : '');
$istartpos = strpos($fullpath, $_SERVER["DOCUMENT_ROOT"]);
$iendpos = $istartpos + strlen(str_replace('\\', '/', $_SERVER["DOCUMENT_ROOT"]));
$relpath = substr($fullpath, $iendpos);
$relpath .= (substr($relpath, -1) != '/') ? '/' : '';
}
$pixlie_table_env['path_pixlie'] = 'http://'.$_SERVER['HTTP_HOST'].
((substr($_SERVER['HTTP_HOST'],-1) != '/' && substr($relpath,0,1) != '/')?'/':'').
$relpath.basename($__FILE__);
}
else{
pixlie_error($pixlie_lang['dir_opendir_false']);}
/******************************* 9.6 Sortierung der Datentabellen *******************************/
if(count($pixlie_table_file)>1){
foreach ($pixlie_table_file as $pixlie_sort_key => $pixlie_sort_row){
$pixlie_first_sort_row[$pixlie_sort_key] = @$pixlie_sort_row[$pixlie_config['sort_file_first_row']];
$pixlie_second_sort_row[$pixlie_sort_key] = @$pixlie_sort_row[$pixlie_config['sort_file_second_row']];}
array_multisort($pixlie_first_sort_row, $pixlie_config['sort_file_first_order'],
$pixlie_config['sort_file_first_type'], $pixlie_second_sort_row,
$pixlie_config['sort_file_second_order'], $pixlie_config['sort_file_second_type'],
$pixlie_table_file);
unset($pixlie_first_sort_row,$pixlie_second_sort_row);}
if(count($pixlie_table_dir)>1){
foreach ($pixlie_table_dir as $pixlie_sort_key => $pixlie_sort_row){
$pixlie_first_sort_row[$pixlie_sort_key] = @$pixlie_sort_row[$pixlie_config['sort_dir_first_row']];
$pixlie_second_sort_row[$pixlie_sort_key] = @$pixlie_sort_row[$pixlie_config['sort_dir_second_row']];}
array_multisort($pixlie_first_sort_row, $pixlie_config['sort_dir_first_order'],
$pixlie_config['sort_dir_first_type'], $pixlie_second_sort_row,
$pixlie_config['sort_dir_second_order'], $pixlie_config['sort_dir_second_type'],
$pixlie_table_dir);
unset($pixlie_first_sort_row,$pixlie_second_sort_row);}
/************************************* 9.7 Ausgabe via JSON *************************************/
switch($pixlie_config['response_type']){
case 'php':
//no content output. use the var $pixlie_table_file and $pixlie_table_dir in your php file
break;
case 'json':
header("Content-Type: text/html; charset=utf-8");
$json = array(
'pixlie_table_env'=> $pixlie_table_env,
'pixlie_table_dir'=> $pixlie_table_dir,
'pixlie_table_file'=> $pixlie_table_file);
echo json_encode($json);
break;}
//Diese Arrays koennen bei einem include verwendet werden.
/*
//Testausgabe:
echo '<pre>';
print_r($pixlie_table_env);
print_r($pixlie_table_file);
print_r($pixlie_table_dir);
echo '</pre>';
*/
}
ob_flush(); //Ausgabe des Puffers
?>