Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
  etherius schrieb:

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.

Geschrieben

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]

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Weiterlesen  

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...