ScaraX: Formeln für Thumbnail-Script gesucht

Beitrag lesen

Hi,

Ich arbeite an einem PHP-Script, um aus Bildern thumbnails zu generieren, welches mit allen Größen und Seitenverhältnissen zurechtkommt.

Bei falschen Seitenverhältnis von Ursprungs-Bild zu (gewünschter) Thumbnail-Größe soll es 4 Möglichkeiten geben, wie das Script damit umgehen soll:
(Das Bild soll in keinem Fall verzogen werden)

Beispiel-Quelle: 400x800px http://weblords.net/bilder/test_high.jpg
Beispiel-Thumbnail-Größe: 200x100px

Freiräume füllen: Das Bild wird soweit verkleinert, dass es vollständig im Thumbnail zu sehen ist, die freien Flächen werden mit einer Farbe gefüllt.

Abschneiden: Das Bild wird soweit verkleinert, dass das Thumbnail vollständig ausgefüllt ist, überstehende Flächen werden abgeschnitten

Thumb-Größe anpassen: wie "Freuräume füllen", nur werden die freien flächen vom Thumbnail abgeschnitten.

sooo... jetzt zu meinem Problem:
Ich möchte noch eine 4. Methode haben, die eine Mischung aus den ersten beiden ist, also etwas abschneiden, und etwas die Flächen füllen:

Ich hab es aber nicht geschafft eine anständige Formel dafür zu finden.
Bei den Anderen Methoden mache ich es folgendermaßen:
($this->width/height = Ursprungsbild,
$height/$width = gewünschte thumbnail-größen
$dimensions['width/height'] = tatsächliche Thumbnail-Größen
Alle Anderen $dimensions_parameter siehe http://de3.php.net/manual/de/function.imagecopyresampled.php
)

  
//Methode 1:  
				$dimensions['width'] = $width;  
				$dimensions['height'] = $height;  
				$dimensions['src_x'] = 0;  
				$dimensions['src_y'] = 0;  
				$dimensions['src_w'] = $this->width;  
				$dimensions['src_h'] = $this->height;  
				if($this->width / $this->height > $width / $height) {  
					$dimensions['dst_w'] = $width;  
					$dimensions['dst_h'] = $this->height / ($this->width / $width);  
  
					$dimensions['dst_x'] = 0;  
					$dimensions['dst_y'] = ($height - $dimensions['dst_h']) / 2;  
				} else {  
					$dimensions['dst_h'] = $height;  
					$dimensions['dst_w'] = $this->width / ($this->height / $height);  
  
					$dimensions['dst_y'] = 0;  
					$dimensions['dst_x'] = ($width - $dimensions['dst_w']) / 2;  
				}  
  
//Methode 2:  
				$dimensions['width'] = $width;  
				$dimensions['height'] = $height;  
  
				$dimensions['dst_x'] = 0;  
				$dimensions['dst_y'] = 0;  
				$dimensions['dst_w'] = $width;  
				$dimensions['dst_h'] = $height;  
  
				if($this->width / $this->height > $width / $height) {  
					$dimensions['src_w'] = (($width) / ($this->width / ($this->height / $height))) * $this->width;  
					$dimensions['src_h'] = $this->height;  
					$dimensions['src_y'] = 0;  
					$dimensions['src_x'] = ($this->width - $dimensions['src_w']) / 2;  
				} else {  
					$dimensions['src_h'] = (($height) / ($this->height / ($this->width / $width))) * $this->height;  
					$dimensions['src_w'] = $this->width;  
					$dimensions['src_x'] = 0;  
					$dimensions['src_y'] = ($this->height - $dimensions['src_h']) / 2;  
				}  
  
//Methode 3:  
				$dimensions['src_y'] = 0;  
				$dimensions['src_x'] = 0;  
				$dimensions['src_w'] = $this->width;  
				$dimensions['src_h'] = $this->height;  
  
				$dimensions['dst_x'] = 0;  
				$dimensions['src_y'] = 0;  
					  
				if(($this->width / $this->height) > ($width / $height)) {  
					$dimensions['dst_w'] = $width;  
					$dimensions['dst_h'] = ($width / $this->width) * $this->height;  
				} else {  
					$dimensions['dst_h'] = $height;  
					$dimensions['dst_w'] = ($height / $this->height) * $this->width;  
				}  
					  
				$dimensions['width'] = $dimensions['dst_w'];  
				$dimensions['height'] = $dimensions['dst_h'];  

Für Methode 4 hab ich kein Vernünftiges Ergebnis gefunden :(
Ich hoffe ihr könnt mir hier weiterhelfen :)

MfG
ScaraX