function createThumbnail($source, $destination, $width, $height) { try { // Pobranie pełnych ścieżek do źródła i celu $sourcePath = realpath($source); $destinationDir = dirname($destination); $destinationPath = $destinationDir . '/' . basename($destination); // Sprawdzenie, czy plik źródłowy istnieje if (!$sourcePath || !file_exists($sourcePath)) { throw new Exception("Plik źródłowy nie istnieje: $source"); } // Pobranie informacji o obrazie $info = getimagesize($sourcePath); if ($info === false) { throw new Exception("Nie można odczytać pliku źródłowego: $sourcePath"); } // Obsługa różnych formatów obrazów switch ($info['mime']) { case 'image/jpeg': $srcImage = imagecreatefromjpeg($sourcePath); break; case 'image/png': $srcImage = imagecreatefrompng($sourcePath); break; case 'image/gif': $srcImage = imagecreatefromgif($sourcePath); break; default: throw new Exception("Nieobsługiwany format obrazu: {$info['mime']}"); } // Tworzenie katalogu docelowego, jeśli nie istnieje if (!is_dir($destinationDir)) { if (!mkdir($destinationDir, 0755, true)) { throw new Exception("Nie można utworzyć katalogu docelowego: $destinationDir"); } } // Tworzenie miniaturki $thumb = imagecreatetruecolor($width, $height); // Obsługa przezroczystości dla PNG i GIF if ($info['mime'] === 'image/png' || $info['mime'] === 'image/gif') { imagealphablending($thumb, false); imagesavealpha($thumb, true); $transparent = imagecolorallocatealpha($thumb, 0, 0, 0, 127); imagefilledrectangle($thumb, 0, 0, $width, $height, $transparent); } // Skalowanie obrazu if (!imagecopyresampled($thumb, $srcImage, 0, 0, 0, 0, $width, $height, $info[0], $info[1])) { throw new Exception("Błąd podczas skalowania obrazu."); } // Zapisywanie miniaturki w odpowiednim formacie switch ($info['mime']) { case 'image/jpeg': if (!imagejpeg($thumb, $destinationPath)) { throw new Exception("Błąd podczas zapisywania miniaturki w: $destinationPath"); } break; case 'image/png': if (!imagepng($thumb, $destinationPath)) { throw new Exception("Błąd podczas zapisywania miniaturki w: $destinationPath"); } break; case 'image/gif': if (!imagegif($thumb, $destinationPath)) { throw new Exception("Błąd podczas zapisywania miniaturki w: $destinationPath"); } break; } // Informacja o powodzeniu echo "✅ Miniaturka została zapisana w: $destinationPath\n"; // Zwolnienie pamięci imagedestroy($srcImage); imagedestroy($thumb); } catch (Exception $e) { // Obsługa błędów echo "❌ Błąd: " . $e->getMessage() . "\n"; } }