ScaraX: Formeln für Thumbnail-Script gesucht

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

  1. Hi,

    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.

    Du hast es auch nicht geschafft, eine brauchbare Fragestellung zu liefern.

    Statt der über-ausführlichen Beschreibung der anderen Methoden und dem kompletten Code hättest du hier in eine deutlichere Beschreibung investieren sollen, was genau du denn nun erreichen willst.

    Für Methode 4 hab ich kein Vernünftiges Ergebnis gefunden :(

    Dann liefere mal eine vernünftige Problembeschreibung.
    Bspw. die beiden „etwas“ aus der zitieren Beschreibung bedürfen dringend einer genaueren Spezifizierung.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Dann liefere mal eine vernünftige Problembeschreibung.
      Bspw. die beiden „etwas“ aus der zitieren Beschreibung bedürfen dringend einer genaueren Spezifizierung.

      Damit meine ich, dass die Größe des Bildes im Thumbnail genau zwischen den Größen der 1. und 2. Methode liegen soll.
      Im Beispiel wäre der Schwarze Rand aus Methode 1 halb so Breit, und dafür würde oben und unten dementsprechend ein Teil des Bildes angeschnitten.

      1. Hi,

        Dann liefere mal eine vernünftige Problembeschreibung.
        Bspw. die beiden „etwas“ aus der zitieren Beschreibung bedürfen dringend einer genaueren Spezifizierung.

        Damit meine ich, dass die Größe des Bildes im Thumbnail genau zwischen den Größen der 1. und 2. Methode liegen soll.

        Dann definiere „genau dazwischen“ - das ist für mich immer noch nicht eindeutiger.

        Im Beispiel wäre der Schwarze Rand aus Methode 1 halb so Breit,

        Na wenn du den schwarzen Rand in deiner Methode 1 berechnen kannst - dann wirst du es wohl auch schaffen, davon noch mal die Hälfte zu berechnen?

        und dafür würde oben und unten dementsprechend ein Teil des Bildes angeschnitten.

        Dann schneide anschliessend „dementsprechend“ - dem zuvor ermittelnten halben schwarzen Rand entsprechend. (Wenn das wirklich das ist, was du willst).

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hallo ScaraX,

    nimm doch einfach als Berechnungsgrundlage die Flächen der ersten Methode von aufgefülltem Hintergrund und skaliertem Bild. Berechne dann, wie groß der Bildausschnitt als Fläche sein muss, damit die Hintergrundfläche nur noch halb so groß ist. Je nach dem nimmst Du dann entweder X- oder Y-Achse des Originalbildes, skalierst es dementsprechend herunter und platzierst dieses Resultat mittig.

    Gruß aus Berlin!
    eddi