etherius Geschrieben 9. Mai 2007 Teilen Geschrieben 9. Mai 2007 Huhu allerseits, ich arbeite gerade an einem recht umfangreichen kundenprojekt bei dem folgendes passieren soll: ich habe eine definierte Fläche (Rahmen) in die ein Bild hineingeladen werden soll. Sagen wir die Fläche ist 150x80 pixel groß. Ich will jetzt ein Bild von der Größe 1024x768 in diesen Rahmen rein setzen. also rechne ich den verkleinerungsfaktor anhand der längeren bildseite aus: 150/1024 = 0,146484375 Neue Breite ist also: 768*0,146484375 = 112,5 112,5 ist aber zu groß um in meinen Rahmen mit 80px Höhe rein zu passen. Hat jemand eine Idee wir ich das Bild so resized kriege dass es in den Rahmen passt? Ich verzweifle da grad dran mein aktueller code: private function _resizeItemImage($image,$width,$height,$dest_width,$dest_height) { if ( $height==$dest_height && $width==$dest_width ) { return $image; } $dest = imagecreatetruecolor($dest_width,$dest_height); $bg = imagecolorallocate ($dest, 255, 255, 255); imagefill($dest, 0, 0, $bg); if ( $height<$dest_height && $width<$dest_width ) { // bild passt in den rahmen WORKS $pos_x = round($dest_width/2 - $width/2); $pos_y = round($dest_height/2 - $height/2); imagecopy($dest,$image,$pos_x,$pos_y,0,0,$width,$height); return $dest; } // bild ist irgendwo zu groß für den rahmen if ( $height>$dest_height && $width<=$dest_width) { // breite passt, wir müssen aber trotzdem runter rechnen, weil die höhe nicht passt $factor = $dest_height/$height; } elseif ($width>$dest_width && $height<=$dest_height ) { // höhe passt, wir müssen aber trotzdem runter rechnen, weil die breite nicht passt $factor = $dest_width/$width; } else { if ( $height > $width ) { $factor = $dest_height/$height; if ( ($width*$factor)>$dest_width ) { // zielbild wird nicht passen, muss noch kleiner } } else { $factor = $dest_width/$width; } } $new_width = $width * $factor; $new_height = $height * $factor; $pos_x = round($dest_width/2 - $new_width/2); $pos_y = round($dest_height/2 - $new_height/2); imagecopyresampled($dest,$image,$pos_x,$pos_y,0,0,$new_width,$new_height,$width,$height); header('Content-Type: image/jpeg'); imagejpeg($dest); exit; return $dest; } [/PHP] die bildausgabe ist da testhalber drin ... gruß Jan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 9. Mai 2007 Teilen Geschrieben 9. Mai 2007 ich habe eine definierte Fläche (Rahmen) in die ein Bild hineingeladen werden soll. Sagen wir die Fläche ist 150x80 pixel groß. 150x80 ist kein 4:3 Format. Kein Wunder dass 1024x768 sich nicht einfach so verkleinern läßt Allgemein: Bestimme das Verkleinerungsverhältnis für die Höhe und die Breite und prüf ob die Verkleinerung nach der Breite reicht, und wenn nicht (wie in deinem Beispiel) Verkleiner das Bild nach dem anderen Verhältnis. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 9. Mai 2007 Autor Teilen Geschrieben 9. Mai 2007 Habs endlich hinbekommen: Ich gucke ob die verkleinerten Dimensionen in die eine Richtung immer noch zu groß sind und rechne den faktor einfach nochmal runter. trotzdem danke @JesterDay private function _resizeItemImage($image,$width,$height,$dest_width,$dest_height) { if ( $height==$dest_height && $width==$dest_width ) { return $image; } $dest = imagecreatetruecolor($dest_width,$dest_height); $bg = imagecolorallocate ($dest, 255, 255, 255); imagefill($dest, 0, 0, $bg); if ( $height<$dest_height && $width<$dest_width ) { // bild passt in den rahmen WORKS $pos_x = round($dest_width/2 - $width/2); $pos_y = round($dest_height/2 - $height/2); imagecopy($dest,$image,$pos_x,$pos_y,0,0,$width,$height); return $dest; } // bild ist irgendwo zu groß für den rahmen if ( $height>$dest_height && $width<=$dest_width) { // breite passt, wir müssen aber trotzdem runter rechnen, weil die höhe nicht passt $factor = $dest_height/$height; } elseif ($width>$dest_width && $height<=$dest_height ) { // höhe passt, wir müssen aber trotzdem runter rechnen, weil die breite nicht passt $factor = $dest_width/$width; } else { if ( $height > $width ) { $factor = $dest_height/$height; if ( ($width*$factor)>$dest_width ) { // zielbild wird nicht passen, muss noch kleiner $factor = $factor * (($width*$factor)/$dest_width); } } else { $factor = $dest_width/$width; if ( ($height*$factor)>$dest_height ) { // zielbild wird nicht passen, muss noch kleiner $factor = $factor * ($dest_height/($height*$factor)); } } } $new_width = $width * $factor; $new_height = $height * $factor; $pos_x = round($dest_width/2 - $new_width/2); $pos_y = round($dest_height/2 - $new_height/2); imagecopyresampled($dest,$image,$pos_x,$pos_y,0,0,$new_width,$new_height,$width,$height); return $dest; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.