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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\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 Core\Image\Image;
// Oříznout dolní část
Image::crop(
'photo.jpg',
'photo-bottom.webp',
'webp',
300,
300,
98,
'bottom'
);
Levá část¶
use Core\Image\Image;
// Oříznout levou část (landscape obrázek)
Image::crop(
'landscape.jpg',
'landscape-left.webp',
'webp',
300,
300,
98,
'left'
);
Pravá část¶
use Core\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 Core\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:
Pak v frontend.php:
<?php
use Core\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 Core\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 Core\Image\Image;
$result = Image::resize('bad-file.txt', 'output.webp');
// $result === false → ne obrázek
Záznam chyby¶
use Core\Image\Image;
use Core\Logger\Logger;
if (!Image::resize($input, $output)) {
Logger::error('Image processing failed', [
'input' => $input,
'output' => $output
]);
}
Debugging¶
Ověř, že obrázek existuje¶
Ověř oprávnění adresáře¶
Výstupní soubor¶
Shrnutí - nejčastější příklady¶
use Core\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');