Napisałem taki skrypt do uploadu zdjęć + skalowania do 4 formatów:
$adres_katalogu = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder']; $adres_zdj = $adres_katalogu.$zdj_ilosc.'.jpg'; //format oryginalny $new_img=imagecreatefromjpeg($adres_zdj); $watermark = imagecreatefrompng('../images/watermark.png'); $zwX = imageSX($new_img) - imageSX($watermark); $zwY = imageSY($new_img) - imageSY($watermark); imagecopymerge($new_img, $watermark, $zwX, $zwY, 0, 0, imageSX($watermark), imageSY($watermark), 80); imagejpeg($new_img, "$adres_zdj", 85); //format 20x16 $adres_nowy = $adres_katalogu.$zdj_ilosc.'b.jpg'; $img=imagecreatefromjpeg($adres_zdj); $x = imagesx($img); $y = imagesy($img); $nx = 20; $ny = 16; $new_img = imagecreatetruecolor($nx, $ny); imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx, $ny, $x, $y); imagejpeg($new_img, "$adres_nowy", 85); //format max 180x100 $adres_nowy = $adres_katalogu.$zdj_ilosc.'c.jpg'; $img=imagecreatefromjpeg($adres_zdj); $x = imagesx($img); $y = imagesy($img); if($x > 180){ $nx = 180; $ny = 180 * ($y / $x); }elseif($x < 180){ $nx = $x; $ny = $y; }else{ $nx = $x; $ny = $y; } if($ny > 100){ $nx2 = 100 * ($nx / $ny); $ny2 = 100; }elseif($ny < 100){ $nx2 = $nx; $ny2 = $ny; }else{ $nx2 = $nx; $ny2 = $ny; } $new_img = imagecreatetruecolor($nx2, $ny2); imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx2, $ny2, $x, $y); imagejpeg($new_img, "$adres_nowy", 85); //format max 310x240 $adres_nowy = $adres_katalogu.$zdj_ilosc.'d.jpg'; $img=imagecreatefromjpeg($adres_zdj); $x = imagesx($img); $y = imagesy($img); if($x > 310){ $nx = 310; $ny = 310 * ($y / $x); }elseif($x < 310){ $nx = $x; $ny = $y; }else{ $nx = $x; $ny = $y; } if($ny > 240){ $nx2 = 240 * ($nx / $ny); $ny2 = 240; }elseif($ny < 240){ $nx2 = $nx; $ny2 = $ny; }else{ $nx2 = $nx; $ny2 = $ny; } $new_img = imagecreatetruecolor($nx2, $ny2); imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx2, $ny2, $x, $y); imagejpeg($new_img, "$adres_nowy", 85); //format max 780x*** + watermark $adres_nowy = $adres_katalogu.$zdj_ilosc.'e.jpg'; $img=imagecreatefromjpeg($adres_zdj); $x = imagesx($img); $y = imagesy($img); if($x > 780){ $nx = 780; $ny = 780 * ($y / $x); }elseif($x < 780){ $nx = $x; $ny = $y; }else{ $nx = $x; $ny = $y; } $new_img = imagecreatetruecolor($nx, $ny); imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx, $ny, $x, $y); $watermark = imagecreatefrompng('../images/watermark.png'); $zwX = imageSX($new_img) - imageSX($watermark); $zwY = imageSY($new_img) - imageSY($watermark); imagecopymerge($new_img, $watermark, $zwX, $zwY, 0, 0, imageSX($watermark), imageSY($watermark), 80); imagejpeg($new_img, "$adres_nowy", 85);
Wiem, że lepiej by to wyglądało obiektowo, ale chcę uruchomić skrypt na razie w takiej wersji.
Problem polega na tym, że nie wszystkie skalowane zdjęcia zapisują się na serwerze. Co gorsza po serii testów trudno określić logikę, jaką kieruje się PHP nie zapisując konkretnych zdjęć, np. dodałem ostatnio 5 zdjęć i:
- wszystkie 5 zdjęć zapisały się prawidłowo w pierwszych 3 formatach (oryginalny, 20x16, 180x100)
- żadne zdjęcie nie zapisało się w 4 formacie (310x240)
- pierwsze 3 zdjęcia zapisały się w ostatnim formacie (780x***)
Macie jakieś pomysły co do przyczyn? Czy istnieje możliwość, że zarzynam pamięć serwera (768mb)? Normalnie wykorzystuję 300mb, podczas testowania skryptów było to ponad 700mb.