• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage zur Performance

xXxPeterPanxXx

Neues Mitglied
Hi,

ich will Bilder in einer mysql Datenbank speichern und Sie dann in zwei verschiedenen Größen auf der Website anzeigen. Jetzt weiß ich nicht ob es besser zwei Bilder in der Datenbank abzuspeichern oder nur eins, was ich dann mit PHP bearbeite.

Was soll ich machen?

Ist imagecopyresize() die richtige Funktion zum Verändern der Bildgröße?

MfG xXxPeterPanxXx
 
Zuerst mal würde ich die Bilder selbst NICHT in der Datenbank speichern sondern z.B in einem IMG Verzeichnis. legst du dort z.B. auch ein thumb-Dateiname Thumbnail an, kannst du die Bilder auch ohne grösseren Aufwand verlinken und anderweitig verwenden.

Und ich würde zum verkleinern eher ein neues Bild mit der entsprechenden Endung generieren und das alte Bild dort hinein zu kopieren.
Im folgenden Beispiel sind nur jpg, gif und png Bilder erlaubt.
PHP:
function resize($pfad,$extension)
{
    global $max_t_height, $max_t_width;

    if(!file_exists($pfad))
    {
        return false;
    }

  // Berechnungen
    $size = getimagesize($pfad);
    $breite = $size[0];
    $hoehe = $size[1];

    if($breite <= $hoehe)
    { // Bild ist im Hochformat
        $neueHoehe = $max_t_height;
        $neueBreite = intval($breite*$neueHoehe/$hoehe); // neue Breite berechnen
    }
    else
    { // Bild ist im Querformat
        $neueBreite=$max_t_width;
        $neueHoehe= intval($hoehe*$neueBreite/$breite); // neue Höhe berechnen
    }


  // Thumb erstellen
    if($extension == 'jpg' or ($extension == 'jpeg'))
    {
        $altesBild = ImageCreateFromJPEG($pfad); // Altes Bild
    }
    elseif($extension == 'gif')
    {
        $altesBild = ImageCreateFromGIF($pfad); // Altes Bild
    }
    elseif($extension == 'png')
    {
        $altesBild = ImageCreateFromPNG($pfad); // Altes Bild
    }
    else return FALSE;

    $neuesBild = @ImageCreateTruecolor($neueBreite,$neueHoehe); // Neues Bild wird erstellt
    @imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); // und das alte Bild wird verkleinert hineinkopiert
    return $neuesBild; // das neue Bild wird zurückgegeben
}

function clean_file_name($name)
{
    $name = strtolower($name);
    $zustrich = array(' ','--',':',';'); // // punkt erhalten, windows server können die datei sonst u.U. nicht mehr erkennen
    $name = str_replace($zustrich,'-',$name);
    $name = str_replace("ö","oe",$name);
    $name = str_replace("ä","ae",$name);
    $name = str_replace("ü","ue",$name);
    $name = str_replace("ß","ss",$name);
    $name = preg_replace('~[^0-9a-z-.]+~','',$name); // punkt erhalten, wegen windows-server
    $name = str_replace("quot","",$name);
    $name = str_replace("---","-",$name);
    $name = str_replace("--","-",$name);
    $name = str_replace("-","_",$name); // utf-8 konforme unterstriche im namen
    return $name;
}
Mit $max_t_height und $max_t_width kannst du im Script die maximale Höhe oder Breite festlegen.

Folgender Code erstellt dann dein Thumbnail, die Variablen-Namen sind glaube ich selbstredend (hoffentlich... ;-) )
PHP:
$interner_name = clean_file_name($_FILES['file']['name']);
// Dateinamen von Umlauten und unnützem Zeugs befreien

$Thumb = resize($path.$interner_name,$file_extension); // Funktionsaufruf
ImageGIF($Thumb,$path.$thumbname."/".$interner_name); // Bild wird ausgegeben
chmod($path.$thumbname."/".$interner_name,0744)
@Imagedestroy($Thumb); // und schlussendlich der Speicher freigegeben
 
Nun, man kann ja auch anders strukturieren und Unterverzeichnisse anlegen und ja, warum nicht?
10.000 Bilder sind auch kein Problem. Z.B könntest du über den internen Namen einen Namen vergeben, der JahrMonatTagStundMinuteSekunde.jpg lautet, dann kann man nichts verwechseln. Ich habe einen Kunden, der so schon seit Jahren arbeitet und einige tausend Bilder verwaltet.

ps.
Versendete Verträge werden erst gescanned und dann automaisch abgelegt und in der Kundenverwaltung zugeordnet.
 
Ich glaube vor einiger Zeit mal ein Topic gesehen zu haben wo es um genau so eine Frage ging. Es ist egal wie groß ein Verzeichnis ist. Auf die Performance hat das meist keinen Einfluss. Wenn Du die Bilder aus einer Datenbank erzeugst, kannst Du das Verzeichnis regelmäßig leeren lassen. Wenn die Bilder dann wieder aufgerufen werden, erzeugst Du sie einfach neu. Die Grafikdatei auf Platte liegen zu haben ist in jedem Fall performanter und schonender als sie immer aus einer Datenbank auszulesen.
 
Gut dann habt ihr mich überzeugt.

Dann werde ich den Bildern einzigartige Namen geben, mit dem kann ich trotzdem zusätzlich noch Informationen zu dem Bild aus einer Datenbank holen.

Danke euch beiden.

MfG xXxPeterPanxXx
 
Hallo,

ich bin gerade dabei mein Thumbnail zu erstellen, aber leider nimmt die Funktion imagecreatefromgif() die Variable $_FILES['file']['tmp_name'] nicht an. Die Variable ist aber 100% mit dem Pfad zu dem tmp Ordner gefüllt.

Hier der kurze PHP Code:
PHP:
if ($lower_files == 'gif') {
$altes_bild = imagecreatefromgif($_FILES['file']['tmp_name']);
}
und hier der Error:
Warning
: imagecreatefromgif(/is/htdocs/user_tmp/wp1158326_JHB43K6EP5/phpl3v3dM) [function.imagecreatefromgif]: failed to open stream: No such file or directory in /is/htdocs/wp1158326_JHB43K6EP5/www/coder/bildhoster/index.php on line 83

Es ist doch erlaubt die Bilder aus dem tmp Ordner zu nehmen oder?

Gruß xXxPeterPanxXx
 
Zurück
Oben