Original-Bild in diverse Grössen Resizen

DaveThuet

Erfahrenes Mitglied
Hallo...
Ich stehe vor einem Problem.
Ich betreibe eine Homepage mit Wallpapers und bis heute formatiere ich jedes Bild manuell und lege dieses dann im entsprechenden Ordner ab auf meinen Server.
Nun habe ich gesehen das es auch eine Art PHP-Script dafür gibt der das Resizen automatisch macht. (Details)
Diesen Script, respektive den PHP-Script möchte ich nun auch Anwenden auf meiner Homepage, kann mir jemanden Sagen wie das geht?
Die Idee ist ein Originalbild wie hier (Bild) dann in folgenden Grössen zu ändern (800x600, 1024x768, 1280x800, 1280x960, 1280x1024, 1600x1200, 1920x1200) und das Serverlastig, also Automatisch und dass es dann die neue Grösse in einem neuen Fenster öffnet.
Der Vorteil liegt auf der Hand...
Zurzeit mache ich aus einem Bild 5 bis 7 je nach Originalgrösse des Uploads, dies braucht viel Festplattenplatz auf meinen Server! Bis anhin sind die Grössen 1600x1200 und 1920x1200 nur verfügbar wenn das Uploadbild diese Grösse hat.
Bin für jeden Vorschlag dankbar.
 
Ich würde beim Uploadvorgang die unten beschriebene Funktion einfach so oft ausführen wie du unterschiedliche Versionen brauchst. Sprich User/Admin läd ein Bild hoch und es wird in beispielsweise in 5 verschiedenen Ordnern in 5 verschiedenen Größen abgelegt. Die Resizefunktion ist jedes mal die selbe, nur andere Parameter.

http://www.php-center.de/beitraege/detail.php?a_id=34

und statt
PHP:
ImageCopyResized
PHP:
ImageCopyResampled
verwenden um Bildstörungen zu vermeiden..
 
Zuletzt bearbeitet:
Sprich User/Admin läd ein Bild hoch und es wird in beispielsweise in 5 verschiedenen Ordnern in 5 verschiedenen Größen abgelegt.

Das ist genau was ich nicht mehr machen will? :confused:

Zurzeit mache ich wie Beschrieben jedes Format manuell und möchte mich eben auch vor dieser Datenmenge erlösen. Es würde mir nichts Nützen nur 5 Ordner zu machem mit verschiedenen Grössen, da ich dass jetzt ja so Handhabe nur in einem Ordner.

Ich denke es sollte Möglich sein aus dem Originalbild die anderen Formate zu Resamplen und dann per Button oder Link zum Download anzubieten! :)

Wie auf folgendem Link! Zur Veranschaulichung was ich meine überfahre mal die diversen Pixelgrössen (oben) und beachte die Statusbarleiste des IE, es läuft 100% über einem Script. (Ansehen)

Wäre wirklich sehr Dankbar wenn mir da Jemanden helfen könnte! :(
 
Hallo DaveThuet,

Du willst, dass aus dem EINEN Original-Quellbild je nach Wunsch ein Bild
in entsprechender Auflösung per Script berechnet wird und zwar nur zur reinen
Ausgabe an den User in dem Moment wo er das Bild aufruft?
Steht da die Datenmenge von ein paar .jpgs im Verhältnis zum Rechenaufwand
wenn das Bild immer on-the-fly resized werden soll?!
Wenn du die Seitenverhältnisse änderst also zb von 4:3 auf 16:10 musst du auch darauf achten, dass das Bild nicht verzerrt wird.
Machbar ist das, was du erreichen willst ohne Probleme, du musst dem Bild-Ausgabe-Script
halt mitteilen (im Stile create_img.php?imgid=43543&res=1024x768 ), welche Auflösung gerade angefordert wird und im Script zb per switch je nach Aufruf den entsprechenden Teil mit den von dir festgelegten Auflösungen ausführen lassen...

mfg
 
Drucko: Mit einem entsprechend optimierten Code geht das alles dennoch recht schnell und speichereffizient (so weit man das behaupten kann).

DaveThuet: Wenn du PHP5 Scripte ausführen lassen kannst, würde ich dir eine gekürzte Version meiner Imageklasse zur Verfügung stellen, die u.a. die Ausgabe ohne Verlust der Proportionen (auch bei unproportionaler Streckung und Stauchung) durchführen kann.
 
Hallo DaveThuet,
Du willst, dass aus dem EINEN Original-Quellbild je nach Wunsch ein Bild
in entsprechender Auflösung per Script berechnet wird und zwar nur zur reinen
Ausgabe an den User in dem Moment wo er das Bild aufruft?

Genau in dieser Art denke ich mir das. :)

Drucko: Mit einem entsprechend optimierten Code geht das alles dennoch recht schnell und speichereffizient (so weit man das behaupten kann).

Wenn du PHP5 Scripte ausführen lassen kannst, würde ich dir eine gekürzte Version meiner Imageklasse zur Verfügung stellen, die u.a. die Ausgabe ohne Verlust der Proportionen (auch bei unproportionaler Streckung und Stauchung) durchführen kann.

Hallo maeTimmae...
Ich bin sehr Interessiert an Deinem PHP-Script, ja mein Server ist PHP 5 tauglich.
Meine Idee ist dass die Ausgabe des Scripts sich in ein neues Fenster öffnet mit dem Resultat, also das wann ein Besucher auf sagen wir 1280x1024 Klickt dass sich dann das neu generierte Bild sich als "_blank" öffnet.
Ich Bastle gerade zurzeit an einer Testseite (LINK) und das Originalbild (1600x1200 Pixel) liegt im folgenden Ordner. (images/wallpaper/test/wallpapers/digital-art-test-1600x1200.jpg) Vielleicht brauchst Du diese Angaben?
 
Ich habe mir noch folgendes Überlegt...
Sollte es helfen, damit die Bild-Ratio eingehalten wird könnte ich auch weiterhin folgende zwei Hauptgrössen des Bildes in einem Ordner ablegen:
- 1920x1200 ergibt = 1280x800
- 1600x1200 ergibt = 1280x960, 1152x864, 1024x768, 800x600, 640x480
- Problem ist nur bei 1280x1024 dieses müsste Generiert werden ohne das Bild zu verzerren als Idee einen schwarzen Rand oben und unten einfügen à je 32 Pixel!
 
Kann dir leider von dem momentanen Rechner nicht die aktuelle Version rausgeben - Bin aber total im Umzugsstress und komm zur Zeit nicht wirklich an die optimiertere Version ran.

Also... Drei Teile sind es - Ich überlasse es mal dir, wie du sie Organisierst. Wichtig ist nur, dass du bei der Einbindung der Klasse Image auch die Klasse Image_Exception und Validate einbindest. Wenn es zu Namenskolissionen kommt, benenne sie einfach um und pass den restlichen Quelltext an. Habe es noch ein wenig auf "nur Ausgabe" angepasst. Wenn du generierte Bilder speichern möchtest, kannst du die Image Klasse modifizieren, eine neue Methode schreiben oder die Klasse erweitern.
Sorry, dass die Doku in mittelmäßigem Englisch gehalten ist - Bin nicht so der technische Poet, halte meine Scripte aber allgemein lieber in Englisch :)

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;
    }
}

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;
        }
    }
}

PHP:
/**
 * 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));
    }
}

Wäre natürlich umso besser, wenn du eine integrierte Entwicklungsumgebung, wie zB Zend DE besäßest, denn dann würde die Einarbeitung in die Klasse wesentlich einfacher sein.

Aber nun gut - Erstmal ein Beispiel.
PHP:
/**
 * neues Image Objekt erzeugen aus Bilddatei unter Pfad
 */
$image = new Image('/path/to/file');

/**
 * staucht oder streckt Resource auf Breite und / oder Höhe oder beide
 * 
 * gewünschte Breite im Beispiel: 1024px
 * gewünschte Höhe im Beispiel: 768px
 * Modus: 'fit', 'x' oder 'y'
 *     In 'fit' Wird die Resource auf die beiden Maßangaben angepasst
 *     und das Ursprungsbild wird so gut wie möglich eingepasst
 *     ansonsten wird das Bild mittig ausgerichtet und überstehende Ränder werden abgeschnitten
 * 
 *     'x' orientiert sich an der x-Angabe und passt das Höhenmaß automatisch an,
 *     'y' tut eben dies mit der Breite des Bildes
 */
$image->resizeCanvas(1024, 768, 'fit');

/**
 * zeichne Rahmen um gesamten Inhalt (Bild wird nicht erweitert!)
 * Mehrere Parameter möglich, Breitenangabe nicht möglich (eventuell selbst anpassen)
 */
$image->drawBorder(0x000000);

/**
 * Bette Wasserzeichen ein, sofern das untere Bild größer als die entsprechende Wasserzeichen-Datei ist
 * 
 * benutze dazu Bilddatei unter Pfad 'path/to/watermark'
 * Die Position orientiert sich an der Position der Ziffer auf dem Nummernblock (3 == rechts unten)
 * Innenabstand innerhalb des Originalbilds vom Rand - Benutzung ähnlich der CSS-Padding-Eigenschaft
 *     1. Wert: alle || oben & unten || oben
 *     2. Wert: rechts & links || rechts [optional]
 *     3. Wert: unten [optional]
 *     4. Wert: links [optional]
 *     Weggelassene Werte werden automatisch eingesetzt - Es werden nur die benötigten Werte benutzt
 */
$image->embedImage('path/to/watermark', 3, array(2, 4, 6, 8));

/**
 * Bildqualität bei der Ausgabe: Standardwert 80%
 */
$image->setRenderQuality(85);

/**
 * Ausgabe, sofern kein Header gesendet wurde und Bilddatei gültig ist
 * 
 * mögliche Formate: 'jpeg', 'jpg', 'gif' oder 'png'
 * möglichst mit try und catch verwenden, da so eine geworfene Ausnahme gefangen werden kann
 */
try {
    $image->render('jpeg');
} catch (Image_Exception $e) {
    echo "{$e}\n";
}

/**
 * Anmerkungen:
 * 
 * $image->setCanvasSize($x, $y);
 *     kann verwendet werden um die Bildfläche zu vergrößern oder zu verkleinern
 *     ohne Rescaling und andere Späße
 * $image->getHeight()
 *       ->getWidth()
 *     sind die Methoden um Maße der Bildfläche abzufragen
 * $image->getImageResource()
 *     gibt Referenz auf die Resource zurück
 * ...
 */

Einbinden könntest du das zB so:
PHP:
$path = '/pfad/zur/bilddatei.ext';

$image = new Image($path);

$size = (!empty($_GET['size'])) ? $_GET['size'] : null;
switch ($size) {
    default:
    case '1024x768':
        $image->resizeCanvas(1024, 768, 'fit');
        $image->setRenderQuality(90);
        break;

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

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

    /* ... */
}
$image->render('jpeg');

Und wenn noch Fragen oder Anregungen bestehen, einfach her damit. Wenn ein erfahrenerer Nutzer mal drüberschaut und irgendwelche verbesserungswürdigen Sachen findet, dann bin ich auch sehr interessiert dran... Immer alles selbst zu lernen macht schließlich nicht immer Spaß.
 
Zurück