Skip to content

Příklady použití Image

Tato sekce ukazuje běžné scénáře zpracování obrázků.


Základní použití

Změna velikosti z souboru

Nejjednodušší případ – zmenšit obrázek na max 800×800 pixelů ve WebP:

use Petrovo\Image\Image;

$success = Image::resize(
    'uploads/photo.jpg',      // Vstupní soubor
    'uploads/photo-thumb.webp' // Výstupní soubor
    // Ostatní parametry použijí výchozí hodnoty
);

if ($success) {
    echo "Obrázek zmenšen!";
} else {
    echo "Chyba při zpracování obrázku";
}

Ořez ze souboru

Oříznout obrázek na 200×200 pixelů (čtverec ze středu):

use Petrovo\Image\Image;

$success = Image::crop(
    'uploads/photo.jpg',        // Vstupní soubor
    'uploads/photo-crop.webp',  // Výstupní soubor
    'webp',                      // Formát: WebP
    200,                         // Šířka: 200px
    200,                         // Výška: 200px
    90,                          // Kvalita: 90%
    'center'                     // Pozice: střed
);

if ($success) {
    echo "Obrázek oříznul!";
}

Práce s binárním obsahem

Zpracování nahraného obrázku

Když uživatel nahraje obrázek, máš binární obsah (z $_FILES):

use Petrovo\Image\Image;

// Uživatel nahrál obrázek
if ($_FILES['photo']['error'] === UPLOAD_ERR_OK) {
    $fileContent = file_get_contents($_FILES['photo']['tmp_name']);

    $success = Image::resizeFromContent(
        $fileContent,
        'uploads/processed.webp',
        'webp',
        1200,  // Maximální delší strana
        1200,  // Maximální kratší strana
        95     // Kvalita
    );

    if ($success) {
        echo "Obrázek uploadován a zpracován!";
    }
}

Ořez z obsahu

use Petrovo\Image\Image;

$imageContent = file_get_contents('uploads/photo.jpg');

$success = Image::cropFromContent(
    $imageContent,
    'uploads/avatar.webp',
    'webp',
    150,        // Šířka avataru
    150,        // Výška avataru
    98,         // Vysoká kvalita
    'center'    // Střed tváře/postavy
);

Formáty a kvalita

Konverze na WebP (nejlepší kompresi)

use Petrovo\Image\Image;

// Vysoká kvalita (95-98)
Image::resize(
    'photo.jpg',
    'photo-optimized.webp',
    'webp',
    1600,
    1600,
    98  // Lepší pro web
);

Výstup do JPEG (starší kompatibilita)

use Petrovo\Image\Image;

// JPEG pro starší systémy
Image::resize(
    'photo.jpg',
    'photo-backup.jpg',
    'jpeg',
    1600,
    1600,
    90  // Standardní kvalita pro JPEG
);

Nízká kvalita (menší soubory)

use Petrovo\Image\Image;

// Velmi nízká kvalita pro preview
Image::resize(
    'photo.jpg',
    'photo-preview.webp',
    'webp',
    400,
    400,
    60  // Nízká kvalita = malý soubor
);

Režimy změny velikosti

Automatický režim (doporučuje se)

use Petrovo\Image\Image;

// hardSite = '' (prázdný) = automatické rozhodnutí
Image::resize(
    'photo.jpg',
    'photo-auto.webp',
    'webp',
    1600,
    1600,
    98
    // hardSite není zadán → automatické chování
);

Když je obrázek >1.5× stran, automaticky se použije 'x' nebo 'y'.

Pevná šířka (x režim)

use Petrovo\Image\Image;

// Šířka fixně 800px, výška se přizpůsobí
Image::resize(
    'photo.jpg',
    'photo-800w.webp',
    'webp',
    800,
    1600,
    98,
    'x'  // Pevná šířka
);

Pevná výška (y režim)

use Petrovo\Image\Image;

// Výška fixně 600px, šířka se přizpůsobí
Image::resize(
    'photo.jpg',
    'photo-600h.webp',
    'webp',
    1600,
    600,
    98,
    'y'  // Pevná výška
);

Hard size – obrázek vyplní prostor

use Petrovo\Image\Image;

// Obrázek se zmenší, vycentruje a doplní bílou barvou
Image::resize(
    'photo.jpg',
    'photo-square.webp',
    'webp',
    800,    // Výstupní šířka
    800,    // Výstupní výška
    95,
    'hs'    // Hard size
);

Výsledek: čtverec 800×800px s obrázkem uprostřed a bílým pozadím.

Center fill – obrázek pokryje prostor

use Petrovo\Image\Image;

// Obrázek se zmenší a vycentruje (může být oříznut)
Image::resize(
    'photo.jpg',
    'photo-fill.webp',
    'webp',
    800,
    800,
    95,
    'cf'    // Center fill
);

Výsledek: čtverec 800×800px s obrázkem uprostřed (bez bílé barvy).


Ořezávání – pozice

Střed (default)

use Petrovo\Image\Image;

// Oříznout střed – nejčastější případ
Image::crop(
    'photo.jpg',
    'photo-crop-center.webp',
    'webp',
    300,
    300,
    98,
    'center'  // Střed
);

Horní část

use Petrovo\Image\Image;

// Oříznout horní část (např. tvář v portretu)
Image::crop(
    'portrait.jpg',
    'portrait-top.webp',
    'webp',
    200,
    200,
    98,
    'top'  // Horní část
);

Dolní část

use Petrovo\Image\Image;

// Oříznout dolní část
Image::crop(
    'photo.jpg',
    'photo-bottom.webp',
    'webp',
    300,
    300,
    98,
    'bottom'
);

Levá část

use Petrovo\Image\Image;

// Oříznout levou část (landscape obrázek)
Image::crop(
    'landscape.jpg',
    'landscape-left.webp',
    'webp',
    300,
    300,
    98,
    'left'
);

Pravá část

use Petrovo\Image\Image;

// Oříznout pravou část
Image::crop(
    'landscape.jpg',
    'landscape-right.webp',
    'webp',
    300,
    300,
    98,
    'right'
);

Použití v upload handleru

Typický scénář uploadů

use Petrovo\Image\Image;
use DB;

function handlePhotoUpload() {
    if ($_FILES['photo']['error'] !== UPLOAD_ERR_OK) {
        return ['error' => 'Upload failed'];
    }

    $fileContent = file_get_contents($_FILES['photo']['tmp_name']);

    // Uložit originál
    $originalPath = 'uploads/originals/photo_' . time() . '.webp';
    Image::resizeFromContent($fileContent, $originalPath, 'webp', 2000, 2000, 98);

    // Thumbnail
    $thumbPath = 'uploads/thumbs/photo_' . time() . '.webp';
    Image::cropFromContent($fileContent, $thumbPath, 'webp', 150, 150, 90, 'center');

    // Ulož do DB
    DB::query(
        "INSERT INTO photos (original, thumb) VALUES (?, ?)",
        [$originalPath, $thumbPath]
    );

    return ['status' => 'success'];
}

Integrace s cube systémem

Upload s crop fieldem

V cube's data.yaml:

fields:
  image:
    type: upload
    crop: true
    crop_width: 800
    crop_height: 600

Pak v frontend.php:

<?php
use Petrovo\Image\Image;

$crop = $DATA['image'] ?? null;
if ($crop && isset($crop['crop_file'])) {
    // Soubor je již oříznul admin
    $imagePath = $crop['crop_file'];
} else if ($crop && isset($crop['file'])) {
    // Soubor bez orizu – zpracuj ho
    $imageContent = file_get_contents('uploads/' . $crop['file']);
    $outputPath = 'uploads/crop_' . time() . '.webp';

    Image::cropFromContent(
        $imageContent,
        $outputPath,
        'webp',
        800,
        600,
        95,
        'center'
    );

    $imagePath = $outputPath;
}

echo $imagePath;

Performance tipy

Správně

use Petrovo\Image\Image;

// Zmenšení velké fotky hned po uploadu
$fileContent = file_get_contents($_FILES['photo']['tmp_name']);

Image::resizeFromContent(
    $fileContent,
    'uploads/photo.webp',
    'webp',
    1200,
    1200,
    95
);

Špatně

// Uložit originál v plné velikosti a zpracovávat později
// = zbytečné alokulení a výkon
file_put_contents('uploads/original.jpg', $fileContent);

// Později v cronjob...
$originalContent = file_get_contents('uploads/original.jpg');
Image::resizeFromContent(...);

Chybové stavy

Nevalidní obrázek

use Petrovo\Image\Image;

$result = Image::resize('bad-file.txt', 'output.webp');
// $result === false → ne obrázek

Záznam chyby

use Petrovo\Image\Image;
use Petrovo\Logger\Logger;

if (!Image::resize($input, $output)) {
    Logger::error('Image processing failed', [
        'input' => $input,
        'output' => $output
    ]);
}

Debugging

Ověř, že obrázek existuje

if (!file_exists('uploads/photo.jpg')) {
    echo "Soubor neexistuje";
}

Ověř oprávnění adresáře

ls -la uploads/
# Adresář musí mít write oprávnění (755 nebo 775)

Výstupní soubor

ls -la uploads/photo.webp
# Měl by mít oprávnění 0666 (rw-rw-rw-)

Shrnutí - nejčastější příklady

use Petrovo\Image\Image;

// 1. Zmenšit fotografii
Image::resize('photo.jpg', 'thumb.webp');

// 2. Oříznout na čtverec
Image::crop('photo.jpg', 'square.webp', 'webp', 200, 200, 95, 'center');

// 3. Z obsahu (upload)
$content = file_get_contents($_FILES['pic']['tmp_name']);
Image::resizeFromContent($content, 'output.webp');

// 4. Z obsahu s oříznutím
Image::cropFromContent($content, 'avatar.webp', 'webp', 150, 150, 98, 'center');