Zum Inhalt springen

Bildverkleinerung


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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.

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...