[PHP] Tworzenie miniaturek obrazów

W tym wpisie stworzymy prosty skrypt tworzący miniaturki obrazów. Skrypt składał się będzie z trzech plików: strony z formularzem (upload-form.php), skryptu przetwarzającego dane z formularza (upload.php) oraz skryptu tworzącego miniaturkę (create-thumbnail.php).

Formularz przesyłania obrazka

Na początku należy stworzyć formularz, przez który wysyłany będzie obraz do przetworzenia:

<!DOCTYPE html>
<html>
<head>
    <title>Prześlij obraz</title>
</head>
<body>
    <h1>Prześlij obraz</h1>
    <p>Prześlij obraz, dla którego chcesz wygenerować miniaturkę.</p>
    <form action="upload.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="image" accept="image/*" required>
        <input type="submit" value="Prześlij">
    </form>
</body>
</html>

Skrypt upload.php

Gdy już formularz jest gotowy można napisać kod obsługujący przesyłane dane (w tym przypadku tylko obraz):

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST') {

    $targetDir = 'uploads/';
    $targetFile = $targetDir . basename($_FILES['image']['name']);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION));
    
    // Sprawdzenie, czy przesłany plik jest obrazkiem
    $check = getimagesize($_FILES['image']['tmp_name']);
    if($check === false) {
    
        echo 'Przesłany plik nie jest obrazkiem!';
        $uploadOk = 0;
        
    }
    
    // Sprawdzenie, czy plik już istnieje
    if(file_exists($targetFile)) {
    
        echo 'Plik o tej nazwie już istnieje!';
        $uploadOk = 0;
        
    }
    
    // Sprawdzenie rozmiaru pliku
    if($_FILES['image']['size'] > 10 * 1048576) {
    
        echo 'Przesłany plik jest zbyt duży!';
        $uploadOk = 0;
        
    }
    
    // Dozwolone formaty plików
    $allowedFormats = array('jpg', 'jpeg', 'png', 'gif');
    if(!in_array($imageFileType, $allowedFormats)) {
    
        echo 'Nieprawidłowy typ pliku!';
        $uploadOk = 0;
        
    }
    
    // Jeśli wszystkie warunki są spełnione, przesuń plik do folderu uploads
    if($uploadOk == 1) {
        
        if(move_uploaded_file($_FILES['image']['tmp_name'], $targetFile)) {
        
            include_once 'create-thumbnail.php';
            
        }
        
        else {
        
            echo 'Wystąpił błąd podczas przesyłania pliku.';
            
        }
        
    }
    
}

W powyższym kodzie zabezpieczamy przesyłanie pliku ograniczając jego typ do *.jpg, *.jpeg, *.png oraz *.gif oraz rozmiar do 10 MB.

Plik create-thumbnail.php

Pozostało jeszcze napisać kilka linii kodu generującego miniaturkę z przesłanego obrazu:

<?php

$targetDir = 'uploads/';
    
$image_path = 'uploads/' . $_FILES['image'];

// Tworzenie miniaturki
$thumbnailDir = 'thumbnails/';
$thumbnailFile = $thumbnailDir . $image;
$thumbnailSize = 200; // Rozmiar miniaturki

// Pobranie informacji o przesłanym obrazku
list($width, $height) = getimagesize($image_path);

// Obliczanie proporcji miniaturki
$ratio = $width / $height;
if($ratio > 1) {
    
    $newWidth = $thumbnailSize;
    $newHeight = $thumbnailSize / $ratio;
}
    
else {
    
    $newWidth = $thumbnailSize * $ratio;
    $newHeight = $thumbnailSize;
        
}

// Tworzenie miniaturki na podstawie oryginalnego obrazka
$source = imagecreatefromjpeg($image_path);
$thumbnail = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($thumbnail, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

// Zapisywanie miniaturki
imagejpeg($thumbnail, $thumbnailFile);

// Zwalnianie pamięci
imagedestroy($source);
imagedestroy($thumbnail);

echo 'Miniaturka została utworzona.';

Przed uruchomieniem skryptu należy utworzyć katalogi uploads oraz thumbnails i nadać im prawa do zapisu - 777.

Komentarze

Popular

[C++] Jak obliczyć pole i obwód trapezu?

[HTML] Jak wyśrodkować tekst?

[PHP] Jak pobrać adres strony?