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');