Original-Bild in diverse Grössen Resizen

Erstmals DANKE für diese unglaubliche Datenmenge an PHP-Codes... :eek:
Ich muss Zugeben ich bin schlicht und weg Überfordert :confused:

Wo kommt was rein, (Header, Body, etc...)

Ne Frage...
Dürfte ich Dir meine HTML-Seite senden (per Mail) und Du baust mir Dein Code als Beispiel ein?
Wäre sogar bereit etwas dafür zu Zahlen wenn Du das wünschst... Über den Preis können wir gerne via Mail verhandeln.

Noch ne wichtige Frage...
Wird die Seite mit soviel Code nicht etwas zu schwerr (kb/s) meine Test-Seite hat bereits 48kb und wenn noch der ganze Code reinkommt geht es sicher weit über 100kb, oder? :(

Freue mich wieder von Dir zu Hören respektive zu Lesen.
 
Für solche Codeschnipsel kann ich mich nicht guten Gewissens bezahlen lassen - Das ist es auch nicht wirklich wert.

Selbst einbauen würde ich es dir nur ungern, da auch jede noch so kleine, eigene Erfahrung schult. Also eine Schritt für Schritt Anleitung, wie du die Codes einbindest.

Zuerst legst du ein Verzeichnis an, welches du zB library nennst. Dort hinein erstellst du zwei Dateien, nämlich class.validate.php & class.image.php. Des Weiteren erstellst du nun im obersten Webdokumente-Verzeichnis (wo normalerweise index.html und so liegen) eine Datei wallpaperview.php.
Das sollte also in etwa so aussehen:
Code:
/httpdocs
    /library
        /class.image.php
        /class.validate.php
    /wallpaperview.php
    /...
    /Index File
    /...

Nun schreibst du in die class.image das hier:
PHP:
<?php
/**
 * exception Image_Exception
 *
 */
class Image_Exception extends Exception
{
    /**
     * exception message
     * @var string
     */
    protected $message = null;

    /**
     * constructor
     *
     * @param string $message
     */
    public function __construct($message = '')
    {
        $this->message = &$message;
    }

    public function toString()
    {
        return (string) $this->_message;
    }
}

/**
 * class Image
 *
 */
class Image
{
    private static $_classname = __CLASS__;

    /**
     * image resource
     * @var resource
     */
    protected  $_image = null;

    /**
     * image width
     * @var integer
     */
    private  $_width = 1;

    /**
     * image height
     * @var integer
     */
    private  $_height = 1;

    /**
    * wether to use antialiasing
    * @var boolean
    */
    private  $_antialiasing = true;

    /**
    * wether to use alpha blending
    * @var boolean
    */
    private  $_alphablending = false;

    /**
    * render quality (used for JPEG output)
    * @var integer
    */
    private  $_renderquality = 80;

    /**
     * constructor
     *
     * different parameter values are possible:
     * 1) @param resource of 'gd'
     * 2) @param Image
     * 3) @param string (path to source image)
     * 4) @param integer width
     *    @param integer height (optional, if not set, height = 1)
     * 5) no parameters
     */
    public function __construct()
    {
        $arguments_count = func_num_args();
        $arguments       = func_get_args();

        if ($arguments_count > 0) {
            if (is_resource($arguments[0]) AND get_resource_type($arguments[0]) === 'gd') {
                // $instance = new Image($imageresource);
                // copies image resource as $this->_image
                $this->_image = $arguments[0];
                @imagedestroy($argument[0]);
            } else if ($arguments[0] instanceof self::$_classname) {
                // $instance = new Image($instance of self);
                // copies image resource of an image instance
                $this->_image = $arguments[0]->getImageResource();
            } else if (is_string($arguments[0]) AND is_readable($arguments[0])) {
                // $instance = new Image('/path/to/image.ext');
                // path to an image
                $info = @getimagesize($arguments[0]);

                // GIF, JPEG, PNG
                if (Validate::isBetween($info[2], 1, 3)) {
                    switch ($info[2]) {
                        case 1:  $this->_image = @imagecreatefromgif($arguments[0]); break;
                        case 2:  $this->_image = @imagecreatefromjpeg($arguments[0]); break;
                        case 3:  $this->_image = @imagecreatefrompng($arguments[0]); break;
                    }

                    $this->_width  = $info[0];
                    $this->_height = $info[1];
                }
            } else {
                // $instance = new Image(256);      --> imagecreatetruecolor(256,1)
                // $instance = new Image(256, 128); --> imagecreatetruecolor(256,128)
                // create new image resource
                $this->_width  = (isset($arguments[0]) AND is_integer($arguments[0]) AND $arguments[0] >= 1)
                               ? (int) $arguments[0]
                               : 1;

                $this->height = (isset($arguments[1]) AND is_integer($arguments[1]) AND $arguments[1] >= 1)
                               ? (int) $arguments[1]
                               : 1;

                $this->_image = @imagecreatetruecolor($this->_width, $this->_height);
            }
        }

        if (!is_resource($this->_image) OR  get_resource_type($this->_image) !== 'gd' ) {
            $this->_image = imagecreatetruecolor(1, 1);
        }

        $this->setAntiAliasing(true);
        $this->setAlphaBlending(false);
        $this->setRenderQuality(80);
    }

    /**
     * returns a reference to the image resource
     *
     * @return reference of $this->_image
     */
    public function &getImageResource()
    {
        return $this->_image;
    }

    /**
     * returns width of $this->_image
     *
     * @return integer
     */
    public function getWidth()
    {
        return imagesx($this->_image);
    }

    /**
     * returns height of $this->_image
     *
     * @return integer
     */
    public function getHeight()
    {
        return imagesy($this->_image);
    }

    /**
     * set canvas size
     *
     * @param integer $width
     * @param integer $height
     * @return boolean
     */
    public function setCanvasSize($width, $height)
    {
        settype($width, 'int');
        settype($height, 'int');

        if ($width <= 0) {
            $width = 1;
        }
        if ($height <= 0) {
            $height = 1;
        }

        if ($this->_image === null) {
            if ($this->_image = @imagecreatetruecolor($width, $height)) {
                return true;
            }
        } else if ($image_new = @imagecreatetruecolor($width, $height)
             AND @imagecopy($image_new, $this->_image, 0, 0, 0, 0, $this->_width, $this->_height) )
        {
            imagedestroy($this->_image);
            $this->_image = &$image_new;
            $this->_width  = imagesx($this->_image);
            $this->_height = imagesy($this->_image);
            return true;
        }

        $this->_width  = $this->getWidth();
        $this->_height = $this->getHeight();

        return false;
    }

    /**
     * resize canvas
     *
     * @param integer $width_max
     * @param integer $height_max
     * @param string $scale (case: 'x' [default], 'y', 'fit')
     * @return boolean
     */
    public function resizeCanvas($width_max, $height_max, $scale = 'x')
    {
        if ($this->_image === null) {
            return false;
        }

        settype($width_max, 'int');
        settype($height_max, 'int');
        settype($fixratio, 'float');

        if ($width_max <= 0) {
            $width_max = 1;
        }
        if ($height_max <= 0) {
            $height_max = 1;
        }
        if ($fixratio < 0) {
            $fixratio = 1;
        }

        $source = array( 'width'  => $this->getWidth(),
                         'height' => $this->getHeight() );
        $canvas = array( 'width'  => $width_max,
                         'height' => $height_max );

        $destination = array( 'x1' => 0,
                              'y1' => 0,
                              'x2' => 0,
                              'y2' => 0 );

        $ratio  = $source['width'] / $source['height'];
        $scalar = 1;

        switch ($scale) {
            default:
            case 'x':
                $canvas['height'] = $canvas['width'] / $ratio;
                $destination = array( 'x1' => 0,
                                      'y1' => 0,
                                      'x2' => $canvas['width'],
                                      'y2' => $canvas['height'],
                                      'w'  => $canvas['width'],
                                      'h'  => $canvas['height'] );
                break;

            case 'y':
                $canvas['width']  = $canvas['height'] * $ratio;
                $destination = array( 'x1' => 1,
                                      'y1' => 1,
                                      'x2' => $source['width'],
                                      'y2' => $canvas['height'],
                                      'w'  => $canvas['width'],
                                      'h'  => $canvas['height'] );
                break;

            case 'fit':
                $set = array();
                if (($source['width'] / $source['height']) > ($canvas['width'] / $canvas['height'])) {
                    $scalar = $canvas['height'] / $source['height'];
                    $set['width'] = $scalar * $source['width'];
                    $destination = array( 'x1' => ($canvas['width'] - $source['width'] * $scalar) / 2,
                                          'y1' =>  0,
                                          'x2' => ($canvas['width'] + $source['width'] * $scalar) / 2,
                                          'y2' =>  $canvas['height'],
                                          'w'  =>  $source['width'] * $scalar,
                                          'h'  =>  $canvas['height'] );
                } else {
                    $scalar = $canvas['width'] / $source['width'];
                    $set['height'] = $scalar * $source['height'];
                    $destination = array( 'x1' =>  0,
                                          'y1' => ($canvas['height'] - $source['height'] * $scalar) / 2,
                                          'x2' =>  $canvas['width'],
                                          'y2' => ($canvas['height'] + $source['height'] * $scalar) / 2,
                                          'w'  =>  $canvas['width'],
                                          'h'  =>  $source['height'] * $scalar );
                }
                break;
        }

        if ($canvas['width'] < 1) {
            $canvas['width'] = 1;
        }
        if ($canvas['height'] < 1) {
            $canvas['height'] = 1;
        }

        if ($image_new = @imagecreatetruecolor((int) $canvas['width'], (int) $canvas['height'])
            AND @imagecopyresampled ($image_new,
                                     $this->_image,
                                     (int) $destination['x1'],
                                     (int) $destination['y1'],
                                     (int) 0,
                                     (int) 0,
                                     (int) ($destination['w']),
                                     (int) ($destination['h']),
                                     (int) $source['width'],
                                     (int) $source['height']) )
        {
            $this->_image  = &$image_new;
            $this->_width  = $this->getWidth();
            $this->_height = $this->getHeight();
            return true;
        }

        $this->_width  = $this->getWidth();
        $this->_height = $this->getHeight();
        return false;
    }

    /**
     * sets antialiasing
     *
     * @param boolean $aa
     * @return boolean (success)
     */
    public function setAntiAliasing($antialiasing)
    {
        settype($antialiasing, 'boolean');
        if (@imageantialias($this->_image, $antialiasing)) {
            $this->_antialiasing = $antialiasing;
            return true;
        }
        return false;
    }

    /**
     * sets alpha blending
     *
     * @param boolean $ab
     * @return boolean (success)
     */
    public function setAlphaBlending($alphablending)
    {
        settype($alphablending, 'boolean');
        if (@imagealphablending($this->_image, $alphablending)
            AND @imagesavealpha($this->_image, $alphablending) ) {
            $this->_alphablending = $alphablending;
            return true;
        }
        return false;
    }

    /**
     * sets render quality (JPEG output only)
     *
     * @param integer $quality
     */
    public function setRenderQuality($quality)
    {
        settype($quality, 'int');
        $this->_renderquality = (Validate::isBetween($quality, 0, 100))
                              ? $quality
                              : 80;
    }

    /**
     * output of internal image resource
     *
     * @param string (enum: 'gif', 'png', 'jpeg' [default])
     * @return boolean
     */
    public function render($format = '')
    {
        if (!Validate::isResourceOf($this->_image, 'gd')
            OR  headers_sent() === true) {
            throw new Image_Exception('Rendering Error: No valid Image Resource or Headers already sent!');
        }

        switch ($format) {
            case 'gif':
                header('Content-type: image/gif');
                imagegif($this->_image);
                break;

            case 'png':
                header('Content-type: image/png');
                imagepng($this->_image);
                break;

            case 'jpeg':
            case 'jpg':
            default:
                header('Content-type: image/jpeg');
                imagejpeg($this->_image, '', $this->_renderquality);
                break;
        }

        return true;
    }

    /**
     * fill canvas with $color, beginning at ($x | $y)
     *
     * @param integer $color
     * @param integer $x
     * @param integer $y
     * @return boolean
     */
    public function fillCanvas($color, $x, $y)
    {
        settype($x, 'int');
        settype($y, 'int');

        if ($x <= 0 OR $y <= 0 OR !Validate::isBetween($color, 0x000000, 0xffffff, false, true)) {
            return false;
        }

        if (@imagefill($this->_image, $x, $y, $color)) {
            return true;
        }

        return false;
    }

    /**
     * returns allocated color value of the desired color
     *
     * @param integer, array of integer $color
     * @param integer $alpha
     * @return integer
     */
    public function getColor($color, $alpha = 0)
    {
        settype($alpha, 'int');
        if (!Validate::isBetween($alpha, 0, 127)) {
            $alpha = 0;
        }

        switch (true) {
            case (Validate::ofType($color, 'integer') AND Validate::isBetween($color, 0x000000, 0xffffff)):
                $col = array( 'red'   => 0xff & ($color >> 0x10),
                              'green' => 0xff & ($color >> 0x8),
                              'blue'  => 0xff & ($color) );
                $color = &$col;

            case (is_array($color) AND isset($color['red'], $color['green'], $color['blue'])):
                if (!Validate::isBetween($color['red'], 0x000000, 0xffffff)
                OR !Validate::isBetween($color['green'], 0x000000, 0xffffff)
                OR !Validate::isBetween($color['blue'], 0x000000, 0xffffff)) {
                    break;
                }

                $color = imagecolorallocatealpha($this->_image, $color['red'], $color['green'], $color['blue'], $alpha);
                break;
        }

        return $color;
    }


    /**
     * embed image (if exists) onto canvas
     *
     * @param string, ressource of gd $source
     * @param integer $position
     * @param integer, array $border_padding
     * @return boolean
     * @throws Image_Exception
     */
    public function embedImage($source, $position = 3, $border_padding = array(8, 8, 8, 8))
    {
        // get image resource or throw Image_Exception
        if (Validate::ofType($source, 'string') AND is_readable($source)) {
            $embed       = new self::$_classname($source);
            $image_embed = $embed->getImageResource();

            if (!Validate::isResourceOf($image_embed, 'gd')) {
                return false;
            }
        } else if (Validate::isResourceOf($image_embed, 'gd')) {
            $image_embed = &$source;
        } else if ($source instanceof self::$_classname) {
            $image_embed = $source->getImageResource();
        } else {
            throw new Image_Exception('Embedding Image: Wrong Input Format!');
        }

        $image_embed_size = array('width'  => imagesx($image_embed),
                                  'height' => imagesy($image_embed));

        // padding
        if (is_integer($border_padding)) {
            $padding = array( 0 => (int) $border_padding,
                              1 => (int) $border_padding,
                              2 => (int) $border_padding,
                              3 => (int) $border_padding );
        } else if (is_array($border_padding)) {
            switch (true) {
                case (isset($border_padding[0], $border_padding[1], $border_padding[2], $border_padding[3])):
                    $padding = array( 0 => (int) $border_padding[0],
                                      1 => (int) $border_padding[1],
                                      2 => (int) $border_padding[2],
                                      3 => (int) $border_padding[3] );
                    break;

                case (isset($border_padding[0], $border_padding[1], $border_padding[2])):
                    $padding = array( 0 => (int) $border_padding[0],
                                      1 => (int) $border_padding[1],
                                      2 => (int) $border_padding[2],
                                      3 => (int) $border_padding[1] );
                    break;

                case (isset($border_padding[0], $border_padding[1])):
                    $padding = array( 0 => (int) $border_padding[0],
                                      1 => (int) $border_padding[1],
                                      2 => (int) $border_padding[0],
                                      3 => (int) $border_padding[1] );
                    break;

                case (isset($border_padding[0])):
                    $padding = array( 0 => (int) $border_padding[0],
                                      1 => (int) $border_padding[0],
                                      2 => (int) $border_padding[0],
                                      3 => (int) $border_padding[0] );
                    break;

                default:
                    $padding = array( 0 => (int) 0,
                                      1 => (int) 0,
                                      2 => (int) 0,
                                      3 => (int) 0 );
                    break;
            }
        } else {
            $padding = array( 0 => (int) 0,
                              1 => (int) 0,
                              2 => (int) 0,
                              3 => (int) 0 );
        }

        // return false if embedded image is too wide
        if ((1.5 * $image_embed_size['width']) > $this->getWidth()
             OR (1.5 * $image_embed_size['height']) > $this->getHeight() ) {
            return false;
        }

        // Positioning
        settype($position, 'int');
        if (!Validate::isBetween($position, 1, 9, false, true)) {
            $position = 3;
        }

        switch ($position) {
            case 1:  $destination = array( 'x' =>  $padding[3],
                                           'y' =>  $this->getHeight() - $image_embed_size['height'] - $padding[2] );
                break;
            case 2:  $destination = array( 'x' => ($this->getWidth() - $image_embed_size['width']) / 2,
                                           'y' =>  $this->getHeight() - $image_embed_size['height'] - $padding[2] );
                break;
            case 3:  $destination = array( 'x' =>  $this->getWidth() - $image_embed_size['width'] - $padding[1],
                                           'y' =>  $this->getHeight() - $image_embed_size['height'] - $padding[2] );
                break;
            case 4:  $destination = array( 'x' =>  $padding[3],
                                           'y' => ($this->getHeight() - $image_embed_size['height']) / 2 );
                break;
            case 5:  $destination = array( 'x' => ($this->getWidth() - $image_embed_size['width']) / 2,
                                           'y' => ($this->getHeight() - $image_embed_size['height']) / 2 );
                break;
            case 6:  $destination = array( 'x' =>  $this->getWidth() - $image_embed_size['width'] - $padding[1],
                                           'y' => ($this->getHeight() - $image_embed_size['height']) / 2 );
                break;
            case 7:  $destination = array( 'x' =>  $padding[3],
                                           'y' =>  $padding[0] );
                break;
            case 8:  $destination = array( 'x' => ($this->getWidth() - $image_embed_size['width']) / 2,
                                           'y' =>  $padding[0] );
                break;
            case 9:  $destination = array( 'x' =>  $this->getWidth() - $image_embed_size['width'] - $padding[1],
                                           'y' =>  $padding[0] );
                break;
        }

        imagecopy($this->_image,
                  $image_embed,
                  (int) $destination['x'],
                  (int) $destination['y'],
                  (int) 0,
                  (int) 0,
                  (int) $image_embed_size['width'],
                  (int) $image_embed_size['height']);

        return true;
    }

    /**
     * draw filled rectangle
     *
     * @param integer $color
     * @param integer $x1
     * @param integer $y1
     * @param integer $x2
     * @param integer $y2
     */
    public function drawFilledRectangle($color, $x1, $y1, $x2, $y2)
    {
        imagefilledrectangle($this->_image,
                             (int) $x1,
                             (int) $y1,
                             (int) $x2,
                             (int) $y2,
                             (int) $this->getColor($color));
    }

    /**
     * draw border
     *
     * @param integer $color
     * @param integer $x1
     * @param integer $y1
     * @param integer $x2
     * @param integer $y2
     */
    public function drawBorder($color = 0, $x1 = 1, $y1 = 1, $x2 = null, $y2 = null)
    {
        if ($x2 === null) {
            $x2 = $this->_width;
        }
        if ($y2 === null) {
            $y2 = $this->_height;
        }

        imagerectangle($this->_image,
                       (int) $x1,
                       (int) $y1,
                       (int) $x2,
                       (int) $y2,
                       (int) $this->getColor($color));
    }
}

In die Datei class.validate.php kopierst du dann das hier:

PHP:
<?php
/**
 * class Validate
 */
class Validate
{
    public static function ofType(&$var, $type)
    {
        $type    = strtolower((string) $type);
        $vartype = gettype($var);

        switch ($type) {
            case 'integer':
            case 'int':
                return ($vartype == 'integer') ? true : false;

            case 'bool':
            case 'boolean':
                return ($vartype == 'boolean') ? true : false;

            case 'float':
            case 'double':
                return ($vartype == 'double') ? true : false;

            case 'numeric':
                return ($vartype == 'double' OR $vartype == 'integer') ? true : false;

            case 'string':
                return ($vartype == 'string') ? true : false;

            case 'array':
            case 'vector':
                return ($vartype == 'array') ? true : false;

            case 'object':
                return ($vartype == 'object') ? true : false;

            case 'resource':
                return ($vartype == 'resource') ? true : false;

            case 'nil':
            case 'null':
                return ($vartype == 'NULL') ? true : false;

            case 'scalar':
                return (in_array($vartype, array('integer', 'string', 'double', 'boolean'))) ? true : false;

            default:
                return false;
        }
    }

    /**
     * evaluates if $value is between $left and $right, following $strict
     *
     * @param float $value
     * @param float $left
     * @param float $right
     * @param boolean $strict
     * @return boolean
     */
    public static function isBetween($value, $left, $right, $strict = false, $asinteger = false)
    {
        if (!$asinteger) {
            settype($value, 'float');
            settype($left, 'float');
            settype($right, 'float');
        } else {
            settype($value, 'int');
            settype($left, 'int');
            settype($right, 'int');
        }

        if ($strict !== true) {
            if ($left > $value OR $value > $right) {
                return false;
            }
        } else {
            if ($left >= $value OR $value >= $right) {
                return false;
            }
        }
        return true;
    }

    /**
     * returns true if $resource is a resource and of $type
     *
     * @param resource $resource
     * @param string $type
     * @return boolean
     */
    public static function isResourceOf(&$resource, $type)
    {
        switch (true) {
            case (!is_resource($resource)):
                return false;
                break;

            case (get_resource_type($resource) == strtolower((string) $type)):
                return true;
                break;

            default:
                return false;
                break;
        }
    }
}

Schon fast geschafft!

Was noch fehlt, ist das Script, welche die Anzeige der Bilder regelt. Bist du total neu im Umgang mit einer SQL-Datenbank? Wenn ja, belass ich es bei einem einfachen Vorschlag:
Alle Wallpapers packst du in einer möglichst hohen Auflösung in einen Ordner wallpapers unter httpdocs oder wie auch immer dein Webroot-Directory heißt. Dort lädst du nun die Bilder hoch und benennst sie nach dem Schema 1, 2, 3, 4, ... Also fängst du bei 1.jpg an und gehst dann inkrementiell mit dem Dateinamen nach oben. Wenn du möchtest, kannst du auch führende Nullen oder sowas verwenden, was es besser im Filesystem zu strukturieren.

Folgende Zeilen fügst du einfach in die wallpaperview.php ein:
PHP:
<?php
if (empty($_GET['wallpaper']) OR !ctype_digit($_GET['wallpaper'])) {
    die('Ungültige Bilddatei!');
}
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper'].jpg";

$image = new Image($path);

$size = (!empty($_GET['size'])) ? $_GET['size'] : null;
switch ($size) {
    case 'thumbnail':
        $image->resizeCanvas(150, 96, 'fit');
        break;

    default:
    case 'preview':
        $image->resizeCanvas(500, 375, 'fit');
        break;

    case '800':
    case '800x600':
        $image->resizeCanvas(800, 600, 'fit');
        break;

    case '1024':
    case '1024x768':
        $image->resizeCanvas(1024, 768, 'fit');
        break;

    case '1280_2':
    case '1280x800':
        $image->resizeCanvas(1280, 800, 'fit');
        break;

    case '1280_1':
    case '1280x960':
        $image->resizeCanvas(1280, 960, 'fit');
        break;

    case '1280':
    case '1280x1024':
        $image->resizeCanvas(1280, 1024, 'fit');
        break;

    case '1600':
    case '1600x1200':
        $image->resizeCanvas(1600, 1200, 'fit');
        break;

    case '1920':
    case '1920x1200':
        $image->resizeCanvas(1920, 1200, 'fit');
        break;
}
$image->setRenderQuality(90);
$image->render('jpeg');

Das wars? Das wars - Ehrlich. Was noch fehlt, ist die Anpassung aller anderer Sachen, wie dem Aufruf der Bilder. Diese sollten nämlich von nun an (zumindest mit diesem Script) via /wallpaperview.php?wallpaper=dateiname&size=groesse erfolgen. Also für das Bild 00123.jpg und eine gewünschte Auflösung von 1280 x 1024 Pixel würde der Link so aussehen müssen:
HTML:
<a href="/wallpaperview.php?wallpaper=00123&size=1280x1024">1280 x 1024px</a>
oder
<a href="/wallpaperview.php?wallpaper=00123&size=1280">1280 x 1024px</a>

Wenn keine gültige Größe angegeben wurde, wird standardmäßig ein Vorschaubild mit den Maßen 500 x 375 px generiert, und wenn die Bilddatei nicht vorhanden ist, wird eine Fehlermeldung ausgegeben.

Hoffe, es wurden alle Unklarheiten beseitigt^^

Zur Sache mit dem Speicher: Ja, klar belastet es den Server-RAM, aber nicht den Traffic, denn der ist nur so groß, wie die Datenmengen, die wirklich an den Client gesendet werden - Das sind respektiv nur die "Wallpapers" und die Webdokumente. Und eh du dich vor zu großer Serverlast fürchtest: Seit PHP5 sind die PHP-Image Funktionen noch um einiges effektiver. Kann zwar schonmal passieren, dass zeitweise 2 MB ausgelagert werden, aber das ist eher selten bei so kleinen Sachen und verschafft noch lange keine Probleme.
 
> Kann zwar schonmal passieren, dass zeitweise 2 MB ausgelagert werden,
> aber das ist eher selten bei so kleinen Sachen

Na das glaube ich weniger.
Nur beim einlesen eines 1280 x 1024px Bild sind schon über 6MB weg, und da ist noch kein neues Bild erzeugt worden.
Und wenn dann zeitgleich noch weitere Bilder erzeugt werden ist Ruhe im Kasten.

> Seit PHP5 sind die PHP-Image Funktionen noch um einiges effektiver

Sind zwar schneller, aber verbrauchen mehr Speicher.
 
Das wars? Das wars - Ehrlich.
Hoffe, es wurden alle Unklarheiten beseitigt.

Morgen!
Erstmals danke für die Schritt zu Schritt anleitung!

Ich habe nun alles genau wie Beschrieben gemacht...

- Ordner "library" mit: "class.validate.php" & "class.image.php" (Die Codes wurden je File 1zu1 eingefügt)
- Ordner "wallpapers" in oberster Ebenne mit fogendem Testbild drin: 0300000001.jpg (Erläuterung zur Zahl: 03 für die Kategorie, 000 für mögliche Unterkategorien und 00001 fürs Bild)
- Im Hauptverzeichniss (oberste Ebenne) die "wallpaperview.php" mit dem angegebenen Code kreiert (Ebenfalls 1zu1 eingefügt)
- Die Verlinkung in der Vorschau-Seite wie beschrieben eingefügt: "<a href="/wallpaperview.php?wallpaper=00123&size=1280x1024">1280x1024</a>"

Leider öffnet sich nur eine weisse Seite wenn man nun auf den Link "1280x1024" klickt?
Link zur Testseite in HTML (Link) und zur Testseite in PHP (Link) was zwar keinen Unterschied ausmacht da ja keine PHP-Codes in der Seite vorhanden sind.
 
Zuletzt bearbeitet:
Na das glaube ich weniger.
Nur beim einlesen eines 1280 x 1024px Bild sind schon über 6MB weg, und da ist noch kein neues Bild erzeugt worden.
Und wenn dann zeitgleich noch weitere Bilder erzeugt werden ist Ruhe im Kasten.
Habe andere Erfahrungen gemacht - Sogar extra Benchmarks durchgeführt. Kann dieses Statement also nicht unterschreiben, aber vielleicht ist es auch einfach eine Sache des OS und der PHP-Konfiguration / -Compilation. Das höchste aller Gefühle verursachte bei mir eine 500kB JPEG mit 1280 x 1024px im Test mit einer Belastung des RAM von 3MB, die ich mit ein paar "Maleffekten" bearbeitet habe. Das Rendering lief innerhalb von 0.01 Sekunden ab und weniger, also nicht wirklich relevant, wenn man die Speicheroptimierungen von PHP5 einfließen lässt.

Leider öffnet sich nur eine weisse Seite wenn man nun auf den Link "1280x1024" klickt?
Dann geht es jetzt an's manuelle Debugging.
Oder auch nicht - Ich denke, ich hab den Fehler gefunden...

PHP:
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper'].jpg";
// ersetzen mit
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper']}.jpg");
Zu Beginn des Scripts aber bitte auch noch diese zwei Zeilen einfügen:
PHP:
ini_set('error_reporting', 'on');
error_reporting(E_ALL);

Und dann nochmal testen.
 
Dann geht es jetzt an's manuelle Debugging.
Oder auch nicht - Ich denke, ich hab den Fehler gefunden...
Und dann nochmal testen.

Habe die wallpaperview.php geändert in:
PHP:
<?php 

ini_set('error_reporting', 'on');
error_reporting(E_ALL);

if (empty($_GET['wallpaper']) OR !ctype_digit($_GET['wallpaper'])) { 
    die('Ungültige Bilddatei!'); 
} 
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper']}.jpg";

$image = new Image($path); 

$size = (!empty($_GET['size'])) ? $_GET['size'] : null; 
switch ($size) { 
    case 'thumbnail': 
        $image->resizeCanvas(150, 96, 'fit'); 
        break; 

    default: 
    case 'preview': 
        $image->resizeCanvas(500, 375, 'fit'); 
        break; 

    case '800': 
    case '800x600': 
        $image->resizeCanvas(800, 600, 'fit'); 
        break; 

    case '1024': 
    case '1024x768': 
        $image->resizeCanvas(1024, 768, 'fit'); 
        break; 

    case '1280_2': 
    case '1280x800': 
        $image->resizeCanvas(1280, 800, 'fit'); 
        break; 

    case '1280_1': 
    case '1280x960': 
        $image->resizeCanvas(1280, 960, 'fit'); 
        break; 

    case '1280': 
    case '1280x1024': 
        $image->resizeCanvas(1280, 1024, 'fit'); 
        break; 

    case '1600': 
    case '1600x1200': 
        $image->resizeCanvas(1600, 1200, 'fit'); 
        break; 

    case '1920': 
    case '1920x1200': 
        $image->resizeCanvas(1920, 1200, 'fit'); 
        break; 
} 
$image->setRenderQuality(90); 
$image->render('jpeg');

Leider öffnet sich nach wie vor nur eine weisse Seite beim Klick auf 1280x1024 in der test.html Seite...

Gehört evtl. der PHP-Code der wallpaperview.php direkt in die Testseite rein? test.php
Eine Frage, müssen die einzelnen PHP-Codes nicht wieder geschlossen werden in dieser Art </php>... ist nähmlich bei keiner der 3 hergestellten PHP-Datei vorhanden?
 
Zuletzt bearbeitet:
Habe die wallpaperview.php geändert in: [...]

Leider sehe ich noch immer ein
PHP:
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper']}.jpg";
und kein
PHP:
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper']}.jpg");
Ohne die abschließende Klammer wird es auf jeden Fall einen Parsing-Error ergeben, der je nach Error Report Einstellungen nicht direkt ausgegeben wird. Kann gut sein, dass zB die ini_set Direktive gegen die PHP-Konfiguration verstößt und schon hier das Problem auftritt. Ansonsten hat mich eben einer meiner lokalen Compiler darauf aufmerksam gemacht, dass die Imagefunktionen nicht eingebunden sind - Einfach mal alle "@" vor den imagecreatefromgif, jpeg und png entfernen (im Constructor).
PHP:
    public function __construct()
    {
        $arguments_count = func_num_args();
        $arguments       = func_get_args();

        if ($arguments_count > 0) {
            if (is_resource($arguments[0]) AND get_resource_type($arguments[0]) === 'gd') {
                // $instance = new Image($imageresource);
                // copies image resource as $this->_image
                $this->_image = $arguments[0];
                @imagedestroy($argument[0]);
            } else if ($arguments[0] instanceof self::$_classname) {
                // $instance = new Image($instance of self);
                // copies image resource of an image instance
                $this->_image = $arguments[0]->getImageResource();
            } else if (is_string($arguments[0]) AND is_readable($arguments[0])) {
                // $instance = new Image('/path/to/image.ext');
                // path to an image
                $info = @getimagesize($arguments[0]);

                // GIF, JPEG, PNG
                if (Validate::isBetween($info[2], 1, 3)) {
                    switch ($info[2]) {
                        case 1:  $this->_image = imagecreatefromgif($arguments[0]); break;
                        case 2:  $this->_image = imagecreatefromjpeg($arguments[0]); break;
                        case 3:  $this->_image = imagecreatefrompng($arguments[0]); break;
                    }

                    $this->_width  = $info[0];
                    $this->_height = $info[1];
                }
            } else {
                // $instance = new Image(256);      --> imagecreatetruecolor(256,1)
                // $instance = new Image(256, 128); --> imagecreatetruecolor(256,128)
                // create new image resource
                $this->_width  = (isset($arguments[0]) AND is_integer($arguments[0]) AND $arguments[0] >= 1)
                               ? (int) $arguments[0]
                               : 1;

                $this->height = (isset($arguments[1]) AND is_integer($arguments[1]) AND $arguments[1] >= 1)
                               ? (int) $arguments[1]
                               : 1;

                $this->_image = @imagecreatetruecolor($this->_width, $this->_height);
            }
        }

        if (!is_resource($this->_image) OR !Validate::isResourceOf($this->_image, 'gd')) {
            throw new Image_Exception("No valid Image Resource!");
        }

        $this->setAntiAliasing(true);
        $this->setAlphaBlending(false);
        $this->setRenderQuality(80);
    }
Wenn die GD-Library nicht eingebunden ist, wird das alles nicht funktionieren.

Gehört evtl. der PHP-Code der wallpaperview.php direkt in die Testseite rein? test.php
Nein, das auf keinen Fall - Denn Bilddaten sind was komplett anderes als sichtbare Textdaten.

Eine Frage, müssen die einzelnen PHP-Codes nicht wieder geschlossen werden in dieser Art </php>... ist nähmlich bei keiner der 3 hergestellten PHP-Datei vorhanden?
Ich lass sie gerne weg, denn sie sind nicht nötig und ersparen eventuelle Zeilenumbrüche in der Darstellung oder andere Leerzeichen, die die Ausgabe stören würden (vor allem bei none-text Daten).

Wie sah denn der Benchmarks aus ?
Vom Schema so:
Code:
$a = null;
// definiere Farben um die relevanten Messungen nicht zu stark zu beeinflussen durch ständige Auslagerung eines neuen Werts
define('CL_BLACK', 0x000000);
define('CL_WHITE', 0xffffff);

Messung utime #1
Messung RAM #1

Schleife [x Durchläufe] {
    $a = imagecreatetruecolor(1280, 1024);
    Floodfill auf 0xffffff
    gefüllte und nicht gefüllte Rechtecke in Schwarz
    $a = null;
}

Messung RAM #2
Messung utime #2

Ausgabe RAM #2 - RAM #1
Ausgabe utime #2 - RAM #1

Könnte es einfach möglich sein, dass $resource = null die Wirkung von imagedestroy "übernimmt", es aber nicht so sorgfältig ausführt? Die Resource sollte eigentlich erhalten bleiben. Also irgendwas kommt mir hier jetzt total spartanisch vor. Werde die Messung wohl oder übel nochmal wiederholen - Ändert aber dennoch nichts an der Rechenzeit, die verhältnismäßig sehr kurz war :rolleyes:
 
Habe es Korrigiert...

Die imageview.php:
PHP:
<?php 

ini_set('error_reporting', 'on');
error_reporting(E_ALL);

if (empty($_GET['wallpaper']) OR !ctype_digit($_GET['wallpaper'])) { 
    die('Ungültige Bilddatei!'); 
} 
$path = realpath(dirname(__FILE__) . "/wallpapers/{$_GET['wallpaper']}.jpg");

$image = new Image($path); 

$size = (!empty($_GET['size'])) ? $_GET['size'] : null; 
switch ($size) { 
    case 'thumbnail': 
        $image->resizeCanvas(150, 96, 'fit'); 
        break; 

    default: 
    case 'preview': 
        $image->resizeCanvas(500, 375, 'fit'); 
        break; 

    case '800': 
    case '800x600': 
        $image->resizeCanvas(800, 600, 'fit'); 
        break; 

    case '1024': 
    case '1024x768': 
        $image->resizeCanvas(1024, 768, 'fit'); 
        break; 

    case '1280_2': 
    case '1280x800': 
        $image->resizeCanvas(1280, 800, 'fit'); 
        break; 

    case '1280_1': 
    case '1280x960': 
        $image->resizeCanvas(1280, 960, 'fit'); 
        break; 

    case '1280': 
    case '1280x1024': 
        $image->resizeCanvas(1280, 1024, 'fit'); 
        break; 

    case '1600': 
    case '1600x1200': 
        $image->resizeCanvas(1600, 1200, 'fit'); 
        break; 

    case '1920': 
    case '1920x1200': 
        $image->resizeCanvas(1920, 1200, 'fit'); 
        break; 
} 
$image->setRenderQuality(90); 
$image->render('jpeg');

Und die gesamte class.image.php aus dem Ordner "library":
PHP:
<?php 
/** 
 * exception Image_Exception 
 * 
 */ 
class Image_Exception extends Exception 
{ 
    /** 
     * exception message 
     * @var string 
     */ 
    protected $message = null; 

    /** 
     * constructor 
     * 
     * @param string $message 
     */ 
    public function __construct($message = '') 
    { 
        $this->message = &$message; 
    } 

    public function toString() 
    { 
        return (string) $this->_message; 
    } 
} 

/** 
 * class Image 
 * 
 */ 
class Image 
{ 
    private static $_classname = __CLASS__; 

    /** 
     * image resource 
     * @var resource 
     */ 
    protected  $_image = null; 

    /** 
     * image width 
     * @var integer 
     */ 
    private  $_width = 1; 

    /** 
     * image height 
     * @var integer 
     */ 
    private  $_height = 1; 

    /** 
    * wether to use antialiasing 
    * @var boolean 
    */ 
    private  $_antialiasing = true; 

    /** 
    * wether to use alpha blending 
    * @var boolean 
    */ 
    private  $_alphablending = false; 

    /** 
    * render quality (used for JPEG output) 
    * @var integer 
    */ 
    private  $_renderquality = 80; 

    /** 
     * constructor 
     * 
     * different parameter values are possible: 
     * 1) @param resource of 'gd' 
     * 2) @param Image 
     * 3) @param string (path to source image) 
     * 4) @param integer width 
     *    @param integer height (optional, if not set, height = 1) 
     * 5) no parameters 
     */ 
    public function __construct() 
    { 
        $arguments_count = func_num_args(); 
        $arguments       = func_get_args(); 

        if ($arguments_count > 0) { 
            if (is_resource($arguments[0]) AND get_resource_type($arguments[0]) === 'gd') { 
                // $instance = new Image($imageresource); 
                // copies image resource as $this->_image 
                $this->_image = $arguments[0]; 
                @imagedestroy($argument[0]); 
            } else if ($arguments[0] instanceof self::$_classname) { 
                // $instance = new Image($instance of self); 
                // copies image resource of an image instance 
                $this->_image = $arguments[0]->getImageResource(); 
            } else if (is_string($arguments[0]) AND is_readable($arguments[0])) { 
                // $instance = new Image('/path/to/image.ext'); 
                // path to an image 
                $info = @getimagesize($arguments[0]); 

                // GIF, JPEG, PNG 
                if (Validate::isBetween($info[2], 1, 3)) { 
                    switch ($info[2]) { 
                        case 1:  $this->_image = imagecreatefromgif($arguments[0]); break; 
                        case 2:  $this->_image = imagecreatefromjpeg($arguments[0]); break; 
                        case 3:  $this->_image = imagecreatefrompng($arguments[0]); break; 
                    } 

                    $this->_width  = $info[0]; 
                    $this->_height = $info[1]; 
                } 
            } else { 
                // $instance = new Image(256);      --> imagecreatetruecolor(256,1) 
                // $instance = new Image(256, 128); --> imagecreatetruecolor(256,128) 
                // create new image resource 
                $this->_width  = (isset($arguments[0]) AND is_integer($arguments[0]) AND $arguments[0] >= 1) 
                               ? (int) $arguments[0] 
                               : 1; 

                $this->height = (isset($arguments[1]) AND is_integer($arguments[1]) AND $arguments[1] >= 1) 
                               ? (int) $arguments[1] 
                               : 1; 

                $this->_image = @imagecreatetruecolor($this->_width, $this->_height); 
            } 
        } 

        if (!is_resource($this->_image) OR !Validate::isResourceOf($this->_image, 'gd')) { 
            throw new Image_Exception("No valid Image Resource!"); 
        } 

        $this->setAntiAliasing(true); 
        $this->setAlphaBlending(false); 
        $this->setRenderQuality(80); 
    }  
    /** 
     * returns a reference to the image resource 
     * 
     * @return reference of $this->_image 
     */ 
    public function &getImageResource() 
    { 
        return $this->_image; 
    } 

    /** 
     * returns width of $this->_image 
     * 
     * @return integer 
     */ 
    public function getWidth() 
    { 
        return imagesx($this->_image); 
    } 

    /** 
     * returns height of $this->_image 
     * 
     * @return integer 
     */ 
    public function getHeight() 
    { 
        return imagesy($this->_image); 
    } 

    /** 
     * set canvas size 
     * 
     * @param integer $width 
     * @param integer $height 
     * @return boolean 
     */ 
    public function setCanvasSize($width, $height) 
    { 
        settype($width, 'int'); 
        settype($height, 'int'); 

        if ($width <= 0) { 
            $width = 1; 
        } 
        if ($height <= 0) { 
            $height = 1; 
        } 

        if ($this->_image === null) { 
            if ($this->_image = @imagecreatetruecolor($width, $height)) { 
                return true; 
            } 
        } else if ($image_new = @imagecreatetruecolor($width, $height) 
             AND @imagecopy($image_new, $this->_image, 0, 0, 0, 0, $this->_width, $this->_height) ) 
        { 
            imagedestroy($this->_image); 
            $this->_image = &$image_new; 
            $this->_width  = imagesx($this->_image); 
            $this->_height = imagesy($this->_image); 
            return true; 
        } 

        $this->_width  = $this->getWidth(); 
        $this->_height = $this->getHeight(); 

        return false; 
    } 

    /** 
     * resize canvas 
     * 
     * @param integer $width_max 
     * @param integer $height_max 
     * @param string $scale (case: 'x' [default], 'y', 'fit') 
     * @return boolean 
     */ 
    public function resizeCanvas($width_max, $height_max, $scale = 'x') 
    { 
        if ($this->_image === null) { 
            return false; 
        } 

        settype($width_max, 'int'); 
        settype($height_max, 'int'); 
        settype($fixratio, 'float'); 

        if ($width_max <= 0) { 
            $width_max = 1; 
        } 
        if ($height_max <= 0) { 
            $height_max = 1; 
        } 
        if ($fixratio < 0) { 
            $fixratio = 1; 
        } 

        $source = array( 'width'  => $this->getWidth(), 
                         'height' => $this->getHeight() ); 
        $canvas = array( 'width'  => $width_max, 
                         'height' => $height_max ); 

        $destination = array( 'x1' => 0, 
                              'y1' => 0, 
                              'x2' => 0, 
                              'y2' => 0 ); 

        $ratio  = $source['width'] / $source['height']; 
        $scalar = 1; 

        switch ($scale) { 
            default: 
            case 'x': 
                $canvas['height'] = $canvas['width'] / $ratio; 
                $destination = array( 'x1' => 0, 
                                      'y1' => 0, 
                                      'x2' => $canvas['width'], 
                                      'y2' => $canvas['height'], 
                                      'w'  => $canvas['width'], 
                                      'h'  => $canvas['height'] ); 
                break; 

            case 'y': 
                $canvas['width']  = $canvas['height'] * $ratio; 
                $destination = array( 'x1' => 1, 
                                      'y1' => 1, 
                                      'x2' => $source['width'], 
                                      'y2' => $canvas['height'], 
                                      'w'  => $canvas['width'], 
                                      'h'  => $canvas['height'] ); 
                break; 

            case 'fit': 
                $set = array(); 
                if (($source['width'] / $source['height']) > ($canvas['width'] / $canvas['height'])) { 
                    $scalar = $canvas['height'] / $source['height']; 
                    $set['width'] = $scalar * $source['width']; 
                    $destination = array( 'x1' => ($canvas['width'] - $source['width'] * $scalar) / 2, 
                                          'y1' =>  0, 
                                          'x2' => ($canvas['width'] + $source['width'] * $scalar) / 2, 
                                          'y2' =>  $canvas['height'], 
                                          'w'  =>  $source['width'] * $scalar, 
                                          'h'  =>  $canvas['height'] ); 
                } else { 
                    $scalar = $canvas['width'] / $source['width']; 
                    $set['height'] = $scalar * $source['height']; 
                    $destination = array( 'x1' =>  0, 
                                          'y1' => ($canvas['height'] - $source['height'] * $scalar) / 2, 
                                          'x2' =>  $canvas['width'], 
                                          'y2' => ($canvas['height'] + $source['height'] * $scalar) / 2, 
                                          'w'  =>  $canvas['width'], 
                                          'h'  =>  $source['height'] * $scalar ); 
                } 
                break; 
        } 

        if ($canvas['width'] < 1) { 
            $canvas['width'] = 1; 
        } 
        if ($canvas['height'] < 1) { 
            $canvas['height'] = 1; 
        } 

        if ($image_new = @imagecreatetruecolor((int) $canvas['width'], (int) $canvas['height']) 
            AND @imagecopyresampled ($image_new, 
                                     $this->_image, 
                                     (int) $destination['x1'], 
                                     (int) $destination['y1'], 
                                     (int) 0, 
                                     (int) 0, 
                                     (int) ($destination['w']), 
                                     (int) ($destination['h']), 
                                     (int) $source['width'], 
                                     (int) $source['height']) ) 
        { 
            $this->_image  = &$image_new; 
            $this->_width  = $this->getWidth(); 
            $this->_height = $this->getHeight(); 
            return true; 
        } 

        $this->_width  = $this->getWidth(); 
        $this->_height = $this->getHeight(); 
        return false; 
    } 

    /** 
     * sets antialiasing 
     * 
     * @param boolean $aa 
     * @return boolean (success) 
     */ 
    public function setAntiAliasing($antialiasing) 
    { 
        settype($antialiasing, 'boolean'); 
        if (@imageantialias($this->_image, $antialiasing)) { 
            $this->_antialiasing = $antialiasing; 
            return true; 
        } 
        return false; 
    } 

    /** 
     * sets alpha blending 
     * 
     * @param boolean $ab 
     * @return boolean (success) 
     */ 
    public function setAlphaBlending($alphablending) 
    { 
        settype($alphablending, 'boolean'); 
        if (@imagealphablending($this->_image, $alphablending) 
            AND @imagesavealpha($this->_image, $alphablending) ) { 
            $this->_alphablending = $alphablending; 
            return true; 
        } 
        return false; 
    } 

    /** 
     * sets render quality (JPEG output only) 
     * 
     * @param integer $quality 
     */ 
    public function setRenderQuality($quality) 
    { 
        settype($quality, 'int'); 
        $this->_renderquality = (Validate::isBetween($quality, 0, 100)) 
                              ? $quality 
                              : 80; 
    } 

    /** 
     * output of internal image resource 
     * 
     * @param string (enum: 'gif', 'png', 'jpeg' [default]) 
     * @return boolean 
     */ 
    public function render($format = '') 
    { 
        if (!Validate::isResourceOf($this->_image, 'gd') 
            OR  headers_sent() === true) { 
            throw new Image_Exception('Rendering Error: No valid Image Resource or Headers already sent!'); 
        } 

        switch ($format) { 
            case 'gif': 
                header('Content-type: image/gif'); 
                imagegif($this->_image); 
                break; 

            case 'png': 
                header('Content-type: image/png'); 
                imagepng($this->_image); 
                break; 

            case 'jpeg': 
            case 'jpg': 
            default: 
                header('Content-type: image/jpeg'); 
                imagejpeg($this->_image, '', $this->_renderquality); 
                break; 
        } 

        return true; 
    } 

    /** 
     * fill canvas with $color, beginning at ($x | $y) 
     * 
     * @param integer $color 
     * @param integer $x 
     * @param integer $y 
     * @return boolean 
     */ 
    public function fillCanvas($color, $x, $y) 
    { 
        settype($x, 'int'); 
        settype($y, 'int'); 

        if ($x <= 0 OR $y <= 0 OR !Validate::isBetween($color, 0x000000, 0xffffff, false, true)) { 
            return false; 
        } 

        if (@imagefill($this->_image, $x, $y, $color)) { 
            return true; 
        } 

        return false; 
    } 

    /** 
     * returns allocated color value of the desired color 
     * 
     * @param integer, array of integer $color 
     * @param integer $alpha 
     * @return integer 
     */ 
    public function getColor($color, $alpha = 0) 
    { 
        settype($alpha, 'int'); 
        if (!Validate::isBetween($alpha, 0, 127)) { 
            $alpha = 0; 
        } 

        switch (true) { 
            case (Validate::ofType($color, 'integer') AND Validate::isBetween($color, 0x000000, 0xffffff)): 
                $col = array( 'red'   => 0xff & ($color >> 0x10), 
                              'green' => 0xff & ($color >> 0x8), 
                              'blue'  => 0xff & ($color) ); 
                $color = &$col; 

            case (is_array($color) AND isset($color['red'], $color['green'], $color['blue'])): 
                if (!Validate::isBetween($color['red'], 0x000000, 0xffffff) 
                OR !Validate::isBetween($color['green'], 0x000000, 0xffffff) 
                OR !Validate::isBetween($color['blue'], 0x000000, 0xffffff)) { 
                    break; 
                } 

                $color = imagecolorallocatealpha($this->_image, $color['red'], $color['green'], $color['blue'], $alpha); 
                break; 
        } 

        return $color; 
    } 


    /** 
     * embed image (if exists) onto canvas 
     * 
     * @param string, ressource of gd $source 
     * @param integer $position 
     * @param integer, array $border_padding 
     * @return boolean 
     * @throws Image_Exception 
     */ 
    public function embedImage($source, $position = 3, $border_padding = array(8, 8, 8, 8)) 
    { 
        // get image resource or throw Image_Exception 
        if (Validate::ofType($source, 'string') AND is_readable($source)) { 
            $embed       = new self::$_classname($source); 
            $image_embed = $embed->getImageResource(); 

            if (!Validate::isResourceOf($image_embed, 'gd')) { 
                return false; 
            } 
        } else if (Validate::isResourceOf($image_embed, 'gd')) { 
            $image_embed = &$source; 
        } else if ($source instanceof self::$_classname) { 
            $image_embed = $source->getImageResource(); 
        } else { 
            throw new Image_Exception('Embedding Image: Wrong Input Format!'); 
        } 

        $image_embed_size = array('width'  => imagesx($image_embed), 
                                  'height' => imagesy($image_embed)); 

        // padding 
        if (is_integer($border_padding)) { 
            $padding = array( 0 => (int) $border_padding, 
                              1 => (int) $border_padding, 
                              2 => (int) $border_padding, 
                              3 => (int) $border_padding ); 
        } else if (is_array($border_padding)) { 
            switch (true) { 
                case (isset($border_padding[0], $border_padding[1], $border_padding[2], $border_padding[3])): 
                    $padding = array( 0 => (int) $border_padding[0], 
                                      1 => (int) $border_padding[1], 
                                      2 => (int) $border_padding[2], 
                                      3 => (int) $border_padding[3] ); 
                    break; 

                case (isset($border_padding[0], $border_padding[1], $border_padding[2])): 
                    $padding = array( 0 => (int) $border_padding[0], 
                                      1 => (int) $border_padding[1], 
                                      2 => (int) $border_padding[2], 
                                      3 => (int) $border_padding[1] ); 
                    break; 

                case (isset($border_padding[0], $border_padding[1])): 
                    $padding = array( 0 => (int) $border_padding[0], 
                                      1 => (int) $border_padding[1], 
                                      2 => (int) $border_padding[0], 
                                      3 => (int) $border_padding[1] ); 
                    break; 

                case (isset($border_padding[0])): 
                    $padding = array( 0 => (int) $border_padding[0], 
                                      1 => (int) $border_padding[0], 
                                      2 => (int) $border_padding[0], 
                                      3 => (int) $border_padding[0] ); 
                    break; 

                default: 
                    $padding = array( 0 => (int) 0, 
                                      1 => (int) 0, 
                                      2 => (int) 0, 
                                      3 => (int) 0 ); 
                    break; 
            } 
        } else { 
            $padding = array( 0 => (int) 0, 
                              1 => (int) 0, 
                              2 => (int) 0, 
                              3 => (int) 0 ); 
        } 

        // return false if embedded image is too wide 
        if ((1.5 * $image_embed_size['width']) > $this->getWidth() 
             OR (1.5 * $image_embed_size['height']) > $this->getHeight() ) { 
            return false; 
        } 

        // Positioning 
        settype($position, 'int'); 
        if (!Validate::isBetween($position, 1, 9, false, true)) { 
            $position = 3; 
        } 

        switch ($position) { 
            case 1:  $destination = array( 'x' =>  $padding[3], 
                                           'y' =>  $this->getHeight() - $image_embed_size['height'] - $padding[2] ); 
                break; 
            case 2:  $destination = array( 'x' => ($this->getWidth() - $image_embed_size['width']) / 2, 
                                           'y' =>  $this->getHeight() - $image_embed_size['height'] - $padding[2] ); 
                break; 
            case 3:  $destination = array( 'x' =>  $this->getWidth() - $image_embed_size['width'] - $padding[1], 
                                           'y' =>  $this->getHeight() - $image_embed_size['height'] - $padding[2] ); 
                break; 
            case 4:  $destination = array( 'x' =>  $padding[3], 
                                           'y' => ($this->getHeight() - $image_embed_size['height']) / 2 ); 
                break; 
            case 5:  $destination = array( 'x' => ($this->getWidth() - $image_embed_size['width']) / 2, 
                                           'y' => ($this->getHeight() - $image_embed_size['height']) / 2 ); 
                break; 
            case 6:  $destination = array( 'x' =>  $this->getWidth() - $image_embed_size['width'] - $padding[1], 
                                           'y' => ($this->getHeight() - $image_embed_size['height']) / 2 ); 
                break; 
            case 7:  $destination = array( 'x' =>  $padding[3], 
                                           'y' =>  $padding[0] ); 
                break; 
            case 8:  $destination = array( 'x' => ($this->getWidth() - $image_embed_size['width']) / 2, 
                                           'y' =>  $padding[0] ); 
                break; 
            case 9:  $destination = array( 'x' =>  $this->getWidth() - $image_embed_size['width'] - $padding[1], 
                                           'y' =>  $padding[0] ); 
                break; 
        } 

        imagecopy($this->_image, 
                  $image_embed, 
                  (int) $destination['x'], 
                  (int) $destination['y'], 
                  (int) 0, 
                  (int) 0, 
                  (int) $image_embed_size['width'], 
                  (int) $image_embed_size['height']); 

        return true; 
    } 

    /** 
     * draw filled rectangle 
     * 
     * @param integer $color 
     * @param integer $x1 
     * @param integer $y1 
     * @param integer $x2 
     * @param integer $y2 
     */ 
    public function drawFilledRectangle($color, $x1, $y1, $x2, $y2) 
    { 
        imagefilledrectangle($this->_image, 
                             (int) $x1, 
                             (int) $y1, 
                             (int) $x2, 
                             (int) $y2, 
                             (int) $this->getColor($color)); 
    } 

    /** 
     * draw border 
     * 
     * @param integer $color 
     * @param integer $x1 
     * @param integer $y1 
     * @param integer $x2 
     * @param integer $y2 
     */ 
    public function drawBorder($color = 0, $x1 = 1, $y1 = 1, $x2 = null, $y2 = null) 
    { 
        if ($x2 === null) { 
            $x2 = $this->_width; 
        } 
        if ($y2 === null) { 
            $y2 = $this->_height; 
        } 

        imagerectangle($this->_image, 
                       (int) $x1, 
                       (int) $y1, 
                       (int) $x2, 
                       (int) $y2, 
                       (int) $this->getColor($color)); 
    } 
}

Leider wird nach wie vor eine weisse Seite angezeigt...
Gemäss meinen Provider ist die GD-Lib installiert da PHP 5...
Gibt es eine Möglichkeit das zu überprüfen ob Sie wirklich Installiert ist...?
 
Ob GD_lib installiert oder nicht, kann man sich ja über phpinfo() darüber informieren.

Leider sehe ich bei deiner Geschichte nicht ganz durch.
Wie wird denn das Bild ausgegeben ?
Mit imageview.php oder wallpaperview.php - mit IMG oder A HREF ?

Wo werden die Header gesetzt, die ein Bild braucht ?
Und ich hoffe, dass dein memory_limit groß genug ist, ansonsten stirb der Bearbeitungsprozess ab.
 
Zurück