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