Thumbnails No. 1001

QUEST08

Erfahrenes Mitglied
Hi ihr,

ja ich weiß, dass Thema gab es schon zu genüge. Mein Script funktioniert auch, fast. Die Bildqualität ist jedoch grottenschlecht. Vielleicht kann da jemand mal drüber schauen? Achja, evtl. auch über die Berechnung der Thumbnailgröße? Denn es ist so, dass er zwar die Bilder richtig verkleinert, aber müsste das nicht Doppelt geschehen? Angenommen ein Bild Hat eine Größe von 5000 auf 7000 Pixel (Nur mal so) und Ich erstelle Das Thumb so, dass die längere seite, also 7000 Pixel auf 150 Reduziert wird. DAnn kann es doch immernoch vorkommen, dass die andere Seite meine maximale länge dennoch übertrifft, oder?

Also 2 Dinge:
Thumbnail Bildqualität
Berechnung der Thumbnailgröße korrekt? Danach nochmal berechenen bzw. Abfragen ob eine Seite noch größer als vorgegeben?

PHP:
//Wo liegt das Originalbild
$PicPathIn  = "$endziel";

//Wo soll das Thumbnail hin
$PicPathOut = "$endziel"; 

//Wie heißt das Origninalbild
$bild       = "$name";

//Wie soll sich der Dateiname verändern
$neu        = "TN"; //TN = Thumbnail
$nameneu    = "$neu$name";

//Maximale Breite und Höhe vom Thumbnail
$maxbreite  = "200";
$maxhoehe   = "200";

// Bilddaten ermitteln
$size         = getimagesize("$PicPathIn"."$bild"); 
$breite       =$size[0]; 
$hoehe        =$size[1];

//Prüfen ob Höhe oder Breite größer ist z.B.: 3<4
//Wenn Breite kleiner als Höhe ist, ist Höhe länger
if($breite<$hoehe){
$schritt1 = 100/$hoehe*$maxhoehe; //Ergebnis ist der Prozentuale anteil des Originals
$schritt2 = $breite/100*$schritt1; //Egebnis ist die neue Länge der Breite

$neueHoehe = $maxhoehe;
$neueBreite = $schritt2;
//$neueBreite   =100; 
//$neueHoehe    =intval($hoehe*$neueBreite/$breite); 
} else {
$schritt1 = 100/$breite*$maxbreite; //Ergebnis ist der Prozentuale anteil des Originals
$schritt2 = $hoehe/100*$schritt1; //Egebnis ist die neue Länge der Breite

$neueHoehe = $schritt2;
$neueBreite = $maxbreite;
};

if($size[2]==1) { 
// GIF 
$altesBild=ImageCreateFromGIF("$PicPathIn"."$bild"); 
$neuesBild=imageCreate($neueBreite,$neueHoehe); 
imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
imageGIF($neuesBild,"$PicPathOut"."$nameneu"); //imageGIF($neuesBild,"$PicPathOut"."TN"."$bild2"); 
} 

if($size[2]==2) { 
// JPG 
$altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild"); 
$neuesBild=imageCreate($neueBreite,$neueHoehe); 
imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
ImageJPEG($neuesBild,"$PicPathOut"."$nameneu"); //imageGIF($neuesBild,"$PicPathOut"."TN"."$bild2"); 
} 

if($size[2]==3) { 
// PNG 
$altesBild=ImageCreateFromPNG("$PicPathIn"."$bild"); 
$neuesBild=imageCreate($neueBreite,$neueHoehe); 
imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
ImagePNG($neuesBild,"$PicPathOut"."$nameneu"); //imageGIF($neuesBild,"$PicPathOut"."TN"."$bild2"); 
}
 
Zu Punkt 1. Du kannst als Thumbnail-Bildformat unabhängig der Quelle immer ein beliebiges von dir bevorzugtes Format verwenden. Ich meine das so:

Original = gif => Thumbnail = png
Original = jpg => Thumbnail = png
Original = png => Thumbnail = png

Damit kannst du dann das Beste rausholen. Achja, welche Version von GD ist auf deinem Server installiert?


Punkt 2: Hier einfach mal ein bisschen Pseudo-Code:

PHP:
define("MAX_WIDTH", 100);
define("MAX_HEIGHT", 80);

$infos = getimagesize($uploadedFile);
$ow = $infos[0]; // Original width
$oh = $infos[1]; // Original height

if($ow <=  MAX_WIDTH && $oh <= MAX_HEIGHT )
{
     // creating tn not neccessary
     return;
}

$nw = $ow;
$nh = $oh;
if ( $ow > MAX_WIDTH ) 
{
    $factor = $ow / MAX_WIDTH;
    $nw = MAX_WIDTH;
    $nh = $oh / $factor;
}

if ( $nh > MAX_HEIGHT ) 
{
    $factor = $nh / MAX_HEIGHT;
    $nh = MAX_HEIGHT;
    $nw = $nw / $factor;
}

Könnte so funktionieren.
 
also ich versuche jetzt schon 3 stunden ein Script zu Erstellung von Thumbnails auf die Beine zu stellen was meinen Anforderungen entspricht... schaffs aber nicht... doch das hier sieht ja schon ganz gut aus... könnte mir einer erklären wie ich das umschreiben muss damit die beiden Probleme gelöst werden die hier schon angesprochen werden?

Wäre sehr nett.. danke :)
 
Hab grad keine Lust deinen ganzen Code durchzukauen. Darum hier ein altes Thumb-Script von mir

PHP:
<?php
/**
* @license  	mpl by ERB software
* @author		stefan.erb(at)erb-software.com
* @example 		<img src="thumb.php?file=test.gif&w=90" />
* @param 		file: name der Imagedatei
* @param 		w (otional): maximale Ausdehnung des Thumb 
*/


// Constanten für die Auswertung von getimagesize()
define("BREITE", 0);
define("HOEHE", 1);
define("FORMAT", 2);

define("MAX_SIZE", 100);

// maximal Thumb-Länge defineren. kann auch als w in dem Aufruf mitgegen werden
$maxWidth = ($_GET['w']) ? $_GET['w'] : MAX_SIZE;

if($fileName = $_GET['file']){
    if(substr($fileName,0,4) != 'http'){
        $fileName = dirname(__FILE__)."/".$fileName;
    }
    /**
        getimagesize()
        Es wird ein Array aus 4 Elementen zurück gegeben. Im Array-Index 0 steht
        die Breite. Index 1 enthält die Höhe, 2 ein Flag je nach Grafik-Typ
        (1 = GIF, 2 = JPG, 3 = PNG, SWF = 4) und Index 3 die richtige
        Zeichenkette im Format "height=xxx width=xxx" zur Verwendung im IMG-Tag
        von HTML.
    */
    $sourceInfo = getimagesize($fileName);

    // Image erstellen
    switch($sourceInfo[FORMAT]){
        case 1: $sourceImage = imagecreatefromgif($fileName); break;
        case 2: $sourceImage = imagecreatefromjpeg($fileName); break;
        case 3: $sourceImage = imagecreatefrompng($fileName); break;
    }

    // Verkleinerungsfakor berechnen
    $factor = $maxWidth/max($sourceInfo[BREITE], $sourceInfo[HOEHE]);
    
    // Array mit den Formaten für das Thumb erstellen
    $destinationInfo = array($sourceInfo[BREITE] * $factor, $sourceInfo[HOEHE] * $factor);

    // Erstelle neues leeres Image fürs Thumb
    $destinationImage = imagecreatetruecolor($destinationInfo[BREITE], $destinationInfo[HOEHE]);

	// Kopiere Bild
    imagecopyresampled($destinationImage, $sourceImage, 0, 0, 0, 0, $destinationInfo[BREITE], $destinationInfo[HOEHE], $sourceInfo[BREITE], $sourceInfo[HOEHE]);

    // Zerstöre Sourceimage
    imagedestroy($sourceImage);

    // Gebe Thumb aus
	Header("Content-type: image/gif");
	Header("Content-Disposition: inline; filename=thumb_{$fileName}");
	imagepng($destinationImage);

	// Zerstöre Thumbimage
    imagedestroy($destinationImage);
}
?>
 
Zuletzt bearbeitet:
hey das sieht ja schon ganz gut aus aber mir passen da 2 sachen nich :(

1. Das GET muss weg

Ich will dem Script feste Größen zuteilen so das alle Thumbnails die gleich größe haben,
und den Pfad zum Bild und wo er das Thumbnail speichert bekommt er auch von mir gegeben.

$dirbild
$dirthumb

2. Das Script soll das Bild speichern und nicht ausgeben

speichern -> $dirthumb



leider weiß ich nicht wie ich den Code veränden soll.. sorry:confused:
 
Zuletzt bearbeitet:
Laut dem PHP-Helpfile das ich habe:

int imagepng ( resource $im [, string $filename] )

ImagePNG() erzeugt eine Datei im Format PNG aus im. Falls Sie [filename] angegeben haben, wird die Ausgabe in diese Datei geschrieben, ansonsten wird die Ausgabe direkt an den Browser geleitet.

Ob da die 2 Headerzeiln braucht weiss ich nicht (ich denke, die braucht es nicht). Aber Probieren geht über Studieren.
 
PHP:
					// Constanten für die Auswertung von getimagesize()
define("BREITE", 0);
define("HOEHE", 1);
define("FORMAT", 2);

define("MAX_SIZE", 100);

$w = "350";

// maximal Thumb-Länge defineren. kann auch als w in dem Aufruf mitgegen werden
$maxWidth = $w ? $w : MAX_SIZE;
$fileName = "../bildordner/$bildname";
$thumboutput = "../bildordner/thumb/$bildname";

    /**
        getimagesize()
        Es wird ein Array aus 4 Elementen zurück gegeben. Im Array-Index 0 steht
        die Breite. Index 1 enthält die Höhe, 2 ein Flag je nach Grafik-Typ
        (1 = GIF, 2 = JPG, 3 = PNG, SWF = 4) und Index 3 die richtige
        Zeichenkette im Format "height=xxx width=xxx" zur Verwendung im IMG-Tag
        von HTML.
    */
    $sourceInfo = getimagesize($fileName);

    // Image erstellen
    switch($sourceInfo[FORMAT]){
        case 1: $sourceImage = imagecreatefromgif($fileName); break;
        case 2: $sourceImage = imagecreatefromjpeg($fileName); break;
        case 3: $sourceImage = imagecreatefrompng($fileName); break;
    }

    // Verkleinerungsfakor berechnen
    $factor = $maxWidth/max($sourceInfo[BREITE], $sourceInfo[HOEHE]);
    
    // Array mit den Formaten für das Thumb erstellen
    $destinationInfo = array($sourceInfo[BREITE] * $factor, $sourceInfo[HOEHE] * $factor);

    // Erstelle neues leeres Image fürs Thumb
    $destinationImage = imagecreatetruecolor($destinationInfo[BREITE], $destinationInfo[HOEHE]);

    // Kopiere Bild
    imagecopyresampled($destinationImage, $sourceImage, 0, 0, 0, 0, $destinationInfo[BREITE], $destinationInfo[HOEHE], $sourceInfo[BREITE], $sourceInfo[HOEHE]);

    // Zerstöre Sourceimage
    imagedestroy($sourceImage);

    // Gebe Thumb aus
    imagepng($destinationImage,$thumboutput);

    // Zerstöre Thumbimage
    imagedestroy($destinationImage);

Das ist jetzt mein Code und er funktioniert so wie er soll!

Danke für die Hilfe
 
PHP:
define("MAX_SIZE", 100);

$w = "350";

// maximal Thumb-Länge defineren. kann auch als w in dem Aufruf mitgegen werden
$maxWidth = $w ? $w : MAX_SIZE;
Dies macht kein Sinn. (ist einfach ein Umweg)
Anstelle von dem kannst du gleich den folgenden Einzeiler setzen:
PHP:
    $maxWidth = 350;
 
Zuletzt bearbeitet:
Zurück