miese Qualität beim Bilder skalieren

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich arbeite zur Zeit an einer Seite, bei der zu einzelnen Artikeln ein Bild hochgeladen wird, das an anderen Stellen live per php verkleinert wird. Dazu verwende ich das folgende Script, das aber eine ziemlich miese Qualität erzeugt, wie man an dem anhängenden Beispiel sehen kann.
PHP:
header("Content-Type:image/png", true);
//$quality = 85;
$maxb = $_GET[maxb];
$maxh = $_GET[maxh];
$bild = imagecreatefromjpeg("$_GET[pfad]/$_GET[bildnr]");
$alt_breite = imagesx($bild);
$alt_hoehe = imagesy($bild);

if ($alt_breite <= $alt_hoehe){
	$neu_hoehe = $maxh;
	$neu_breite = round(($neu_hoehe / $alt_hoehe) * $alt_breite);
	if ($neu_breite > $maxb){
		$faktor = $neu_breite / $maxb;
		$neu_breite = $maxb;
		$neu_hoehe = $neu_hoehe * $faktor;
	}
}else{
	$neu_breite = $maxb;
	$neu_hoehe = round(($neu_breite / $alt_breite) * $alt_hoehe);
	if ($neu_hoehe > $maxh){
		$faktor = $neu_hoehe / $maxh;
		$neu_hoehe = $maxh;
		$neu_breite = $neu_breite * $faktor;
	}
}
	
$thumb = imagecreatetruecolor($neu_breite, $neu_hoehe);
imagecopyresampled($thumb, $bild, 0, 0, 0, 0, $neu_breite, $neu_hoehe, $alt_breite, $alt_hoehe);
imagepng($thumb);
//imagejpeg($thumb,"",$quality);

Nun meine Frage. Ist es möglich, die Qualität irgendwie zu verbessern, oder ist das einfach die Einschränkung von php? Merkwürdig ist auch, daß, egal ob das skalierte Bild als jpg oder als png ausgegeben wird, das praktisch identische Ergebnis bei rauskommt.

Viele Grüße,
Sprint
 

Anhänge

  • original.jpg
    original.jpg
    278,5 KB · Aufrufe: 19
  • thumb.php.png
    thumb.php.png
    172,4 KB · Aufrufe: 15
hiho, probier mal:

PHP:
$quality = 85;    // Hier die Qualität in Skale 1-100 einstellen

$bild = imagecreatefromjpeg("$_GET[pfad]/$_GET[bildnr]"); 
$alt_breite = imagesx($bild); 
$alt_hoehe = imagesy($bild); 

$ratio = $alt_breite/$alt_hoehe;


$maxh = $_GET[maxh];
$maxb = $_GET[maxh] * $ratio;

if ($alt_breite <= $alt_hoehe){ 
    $neu_hoehe = $maxh; 
    $neu_breite = round(($neu_hoehe / $alt_hoehe) * $alt_breite); 
    if ($neu_breite > $maxb){ 
        $faktor = $neu_breite / $maxb; 
        $neu_breite = $maxb; 
        $neu_hoehe = $neu_hoehe * $faktor; 
    } 
}else{ 
    $neu_breite = $maxb; 
    $neu_hoehe = round(($neu_breite / $alt_breite) * $alt_hoehe); 
    if ($neu_hoehe > $maxh){ 
        $faktor = $neu_hoehe / $maxh; 
        $neu_hoehe = $maxh; 
        $neu_breite = $neu_breite * $faktor; 
    } 
} 
     
$thumb = imagecreatetruecolor($neu_breite, $neu_hoehe);
// imagecopyresampled($thumb, $bild, 0, 0, 0, 0, $neu_breite, $neu_hoehe, $alt_breite, $alt_hoehe); 
// imagepng($thumb); 

header('Content-Type: image/jpeg');
imagejpeg($thumb,"",$quality);


Die Antwort hattest du schon im Quellcode :)
Sonnige Grüße

[EDIT]
Du kannst auch im PHP Manual nachschauen, dort sind einige Lösungswege vorgegeben:

Hier ein Beispiel, an Deinem Code angepasst:
PHP:
$target_file 	=	"PFAD WO THUMB GESPEICHERT WERDEN SOLL!";
$image 			= imagecreatefromjpeg("$_GET[pfad]/$_GET[bildnr]");

function resize($image, $target_file) {
	list($width, $height) = getimagesize($image['tmp_name']);
	
	$ratio 		= $width/$height;
	$new_height = 500;
	$new_width 	= $new_height * $ratio;

	move_uploaded_file($image['tmp_name'], $target_file);
	
	$new_image = imagecreatetruecolor($new_width, $new_height);
	$old_image = imagecreatefromjpeg($target_file);
	imagecopyresampled($new_image,$old_image,0,0,0,0,$new_width, $new_height, $width, $height);        
	
	imagejpeg($new_image, $target_file, 100);
}
 
Zuletzt bearbeitet:
Zurück