Thumbnails alle neu berechnen?

Hallo liebe Gemeinde! Eine Frage zu Bildergrößen: In unserem Shop sind bereits alle Artikel eingepflegt und alle Bilder zu den Produkten sind auch hochgeladen. Die Bildergröße 3 mit 140x140 Pixel würde ich gerne größer zeigen in 163x163 Pixel. Wie kann ich Shopware dazu bewegen, dass alle bereits eingepflegten Bilder in dieser neuen Größe neu berechnet werden? Im Moment werden nur neue Bilder, die ich neu hochlade in 163x163 erzeugt. Wie bekomme ich die alten Bilder größer? Danke, Florian!

Es gibt irgendwo einen WIKI Artikel dazu. Anbei Code, welcher du in einer PHP Datei speichern muss und in das Shopware Root Verzeichnis kopierst. Oben gibst du die Thumbnail ID an und die neue Größe. Dann die Datei per URL aufrufen und warten :wink: [code]<?php include (“config.php”);

mysql_connect($DB_HOST, $DB_USER, $DB_PASSWORD);

$db_select = mysql_select_db($DB_DATABASE);

$bild = new bildedit();

$uploaddir = ‘images/articles/’;

if (!is_dir($uploaddir)){

die("$uploaddir it´s not a directory");

}

// Thumbnail - Number der zu aktualisierenden Größe und neue Größe x/y in px

$thb = 2;

$thb_x = 240;

$thb_y = 240;

$sql = “SELECT img FROM s_articles_img”;

$result = mysql_query($sql);

echo “”.mysql_num_rows($result)." zu aktualisierende Bilder “; while ($row = mysql_fetch_assoc($result)) { $filename = $row[“img”].”.jpg"; $uploadfile = $uploaddir . basename($filename); if (!file_exists($uploaddir)){ die ("$uploadfile it´s not a file
rn"); } $pictureSize = getimagesize($uploadfile); echo “Source: “.$uploadfile.” ({$pictureSize[“x”]} / {$pictureSize[“y”]}) “; if (!$thb_y){ $bild->resize($uploadfile,$thb_x,0,1,$uploaddir.$row[“img”].”_$thb.jpg”); }else { $bild->resize_dynamic($uploadfile,$thb_x,$thb_y,1,$uploaddir.$row[“img”]."_$thb.jpg"); } echo “Target: “.$uploaddir.$row[“img”].”_$thb.jpg”." ($thb_x / $thb_y) "; } class bildedit { function resize ($picture, $new_width, $new_height, $mode, $newfile) { $image=imagecreatefromjpeg($picture); //erstellt ein Abbild im Speicher $size=getimagesize($picture); //ermittelt die Größe des Bildes $breite=$size[0]; //die Breite des Bildes $hoehe=$size[1]; //die Höhe des Bildes // Verhältnis Breite zu Höhe bestimmen $verhaeltnis = $breite/$hoehe; if ($breite < $new_width){ $breite_neu = $breite; }else { $breite_neu = $new_width; } $hoehe_neu = round($breite_neu / $verhaeltnis,0); $newImage=imagecreatetruecolor($breite_neu,$hoehe_neu); //Thumbnail im Speicher erstellen imagecopyresampled($newImage,$image,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe); imagejpeg($newImage,$newfile,90); //Thumbnail speichern imagedestroy($image); imagedestroy($newImage); } function resize_dynamic ($picture, $new_width, $new_height, $mode, $newfile) { $image=imagecreatefromjpeg($picture); //erstellt ein Abbild im Speicher $size=getimagesize($picture); //ermittelt die Größe des Bildes $breite=$size[0]; //die Breite des Bildes $hoehe=$size[1]; //die Höhe des Bildes // Verhältnis Breite zu Höhe bestimmen if ($breite > $hoehe){ $verhaeltnis = $breite/$hoehe; $breite_neu = $new_width; $hoehe_neu = round($breite_neu / $verhaeltnis,0); }else { $verhaeltnis = $hoehe/$breite; $hoehe_neu = $new_height; $breite_neu = round($hoehe_neu / $verhaeltnis,0); } $newImage=imagecreatetruecolor($breite_neu,$hoehe_neu); //Thumbnail im Speicher erstellen imagecopyresampled($newImage,$image,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe); imagejpeg($newImage,$newfile,90); //Thumbnail speichern imagedestroy($image); imagedestroy($newImage); } } ?> [/code]

Wow, das ging ja sehr zügig! Danke schön, ich werde mein Glück versuchen.

Das Script funktioniert, aber nur teilweise. Es müssen 1792 Bilder resized werden, aber das Script kommt nicht bis zum Ende der Bilder-Liste. Nur ein paar hundert werden resized. Wahrscheinlich darf das Script nicht so lange auf dem Server laufen. Was kann ich machen, damit alle Bilder resized werden?

Man kann es mit dieser Funktion versuchen: [url=http://php.net/manual/en/function.set-time-limit.php]set_time_limit/url Einfach als erste Zeile im Script.

Super! Als Wert musste ich aber noch die 0 einsetzen. Ich hab also nun dies im Script stehen: [code]

Man kann auch über das SQLStatement ein Limit arbeiten. Select bla from Tabelle Limit 0, 800 Und im zweiten Durchgang Limit 800, 1600 Etc. Natürlich nur wenn das mit dem Zeitlimit nicht hinhaut :wink:

Hallo an alle, ich saß gerade ebenfalls vor diesem Problem und wollte nachträglich für mehrere Thumbnailgrößen die Bilder neu erstellen lassen. Unter Shopware 4.0 läuft der obige Code nicht mehr. Ich bin nicht der Top php-Programmierer, aber es funktioniert und es werden jetzt für mehrere Größeren nacheinander die Bilder neu erstellt. Verbesserungs/Optimierungsvorschläge sind gern willkommen! [code]<?php //Skript läuft lange, also Limit aufheben
set_time_limit(0);

$config = include (“config.php”);

if (!is_array($config)) {
  print 'Invalid configuration file provided; PHP file does not return array value';
  exit();
};

mysql_connect($config[‘db’][‘host’], $config[‘db’][‘username’], $config[‘db’][‘password’]);
$db_select = mysql_select_db($config[‘db’][‘dbname’]);

$bild = new bildedit();
$uploaddir = ‘media/image/’;
if (!is_dir($uploaddir)){
die("$uploaddir it´s not a directory");
}

// Thumbnail - neue Größen als key-value Paar x/y in px

$thb[‘30’] = ‘30’;
$thb[‘57’] = ‘57’;
$thb[‘105’] = ‘105’;
$thb[‘140’] = ‘140’;
$thb[‘285’] = ‘255’;
$thb[‘720’] = ‘600’;

$sql = “SELECT img FROM s_articles_img”;
$result = mysql_query($sql);

echo “

".mysql_num_rows($result)." zu aktualisierende Bilder”; while ($row = mysql_fetch_assoc($result)) { $filename = $row[“img”].".jpg"; $uploadfile = $uploaddir . basename($filename); if (!file_exists($uploaddir)){ die ("$uploadfile it´s not a file
rn"); } $pictureSize = getimagesize($uploadfile); echo “Source: “.$uploadfile.” ({$pictureSize[“x”]} / {$pictureSize[“y”]})”; foreach($thb as $key => $value) { echo $key.’-’.$value.’
'; if (!$value){ $bild->resize($uploadfile,$key,0,1,$uploaddir.“thumbnail/”.$row[“img”]."_".$key.“x”.$value.".jpg"); }else { $bild->resize_dynamic($uploadfile,$key,$value,1,$uploaddir.“thumbnail/”.$row[“img”]."_".$key.“x”.$value.".jpg"); } echo "

Target: “.$uploaddir.$row[“img”].”_".$key.“x”.$value."jpg

"; } } class bildedit { function resize ($picture, $new_width, $new_height, $mode, $newfile) { $image=imagecreatefromjpeg($picture); //erstellt ein Abbild im Speicher $size=getimagesize($picture); //ermittelt die Größe des Bildes $breite=$size[0]; //die Breite des Bildes $hoehe=$size[1]; //die Höhe des Bildes // Verhältnis Breite zu Höhe bestimmen $verhaeltnis = $breite/$hoehe; if ($breite < $new_width){ $breite_neu = $breite; }else { $breite_neu = $new_width; } $hoehe_neu = round($breite_neu / $verhaeltnis,0); $newImage=imagecreatetruecolor($breite_neu,$hoehe_neu); //Thumbnail im Speicher erstellen imagecopyresampled($newImage,$image,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe); imagejpeg($newImage,$newfile,90); //Thumbnail speichern imagedestroy($image); imagedestroy($newImage); } function resize_dynamic ($picture, $new_width, $new_height, $mode, $newfile) { $image=imagecreatefromjpeg($picture); //erstellt ein Abbild im Speicher $size=getimagesize($picture); //ermittelt die Größe des Bildes $breite=$size[0]; //die Breite des Bildes $hoehe=$size[1]; //die Höhe des Bildes // Verhältnis Breite zu Höhe bestimmen if ($breite > $hoehe){ $verhaeltnis = $breite/$hoehe; $breite_neu = $new_width; $hoehe_neu = round($breite_neu / $verhaeltnis,0); }else { $verhaeltnis = $hoehe/$breite; $hoehe_neu = $new_height; $breite_neu = round($hoehe_neu / $verhaeltnis,0); } $newImage=imagecreatetruecolor($breite_neu,$hoehe_neu); //Thumbnail im Speicher erstellen imagecopyresampled($newImage,$image,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe); imagejpeg($newImage,$newfile,90); //Thumbnail speichern imagedestroy($image); imagedestroy($newImage); } } ?> [/code]

2 Likes

Erstmal vielen Dank für das Script!! Ich habe drei Fragen dazu: 1. Erstellt dieses Script für alle Bilder neue Größen oder nur für eine Bestimmte Kategrorie, oder allgemein für alle Produktbilder? 2. Muss ich alle vorhandenen Größen nochmal eintragen im Script oder reicht es, nur die neue Größe zu definieren? 3. Muss ich im Backend vorher die neue Größe schon bei den Arikelbildern anlegen? Danke und Grüße, Marc