public function createThumbnail($imagePath, $fileSize, $fileExtension) {
$image = new Imagick($imagePath);
if ($image->getNumberImages() > 1 && strtolower($fileExtension) === 'ico') {
// Выбираем самое большое изображение в ICO файле
$maxWidth = 0;
$maxHeight = 0;
$imageIndex = 0;
foreach ($image as $index => $frame) {
$frameWidth = $frame->getImageWidth();
$frameHeight = $frame->getImageHeight();
if ($frameWidth > $maxWidth || $frameHeight > $maxHeight) {
$maxWidth = $frameWidth;
$maxHeight = $frameHeight;
$imageIndex = $index;
}
}
$image->setIteratorIndex($imageIndex);
}
$newWidth = $image->getImageWidth();
$newHeight = $image->getImageHeight();
$thumbWidth = $this->thumbCreatingParams['Width'];
if ($this->thumbCreatingParams['ResizeMode'] === 'trByWidth') {
$thumbHeight = (int) round(($thumbWidth / $newWidth) * $newHeight);
} elseif ($this->thumbCreatingParams['ResizeMode'] === 'trByHeight') {
$thumbHeight = $newHeight;
$thumbWidth = $newWidth;
}
$image->thumbnailImage($thumbWidth, $thumbHeight, true);
// Подсчет размера в КБ
$fileSizeKB = round($fileSize / 1024, 1);
// Толщина подложек и отступы
$overlayTopThickness = 3; // Толщина подложки сверху, слева и справа
$overlayBottomHeight = 30; // Высота подложки внизу
$transparentBorderThickness = 3; // Толщина прозрачной области
// Создаем новое изображение с прозрачным фоном
$background = new Imagick();
$background->newImage($this->thumbCreatingParams['Width'] + 2 * ($overlayTopThickness + $transparentBorderThickness), $thumbHeight + $overlayBottomHeight + 2 * $transparentBorderThickness + $overlayTopThickness, new ImagickPixel('none'));
$background->setImageFormat('png');
// Цветные подложки
$overlayColor = new ImagickPixel("#222222");
// Верхняя подложка
$overlayTop = new Imagick();
$overlayTop->newImage($this->thumbCreatingParams['Width'] + 2 * $overlayTopThickness, $overlayTopThickness, $overlayColor, 'png');
$background->compositeImage($overlayTop, Imagick::COMPOSITE_OVER, $transparentBorderThickness, $transparentBorderThickness);
// Левая подложка
$overlaySide = new Imagick();
$overlaySide->newImage($overlayTopThickness, $thumbHeight, $overlayColor, 'png');
$background->compositeImage($overlaySide, Imagick::COMPOSITE_OVER, $transparentBorderThickness, $overlayTopThickness + $transparentBorderThickness);
// Правая подложка
$background->compositeImage($overlaySide, Imagick::COMPOSITE_OVER, $this->thumbCreatingParams['Width'] + $overlayTopThickness + $transparentBorderThickness, $overlayTopThickness + $transparentBorderThickness);
// Нижняя подложка
$overlayBottom = new Imagick();
$overlayBottom->newImage($this->thumbCreatingParams['Width'] + 2 * $overlayTopThickness, $overlayBottomHeight, $overlayColor, 'png');
$background->compositeImage($overlayBottom, Imagick::COMPOSITE_OVER, $transparentBorderThickness, $thumbHeight + $overlayTopThickness + $transparentBorderThickness);
// Композитим миниатюру поверх прозрачного фона
$background->compositeImage($image, Imagick::COMPOSITE_OVER, $overlayTopThickness + $transparentBorderThickness, $overlayTopThickness + $transparentBorderThickness);
// Путь к изображению-иконке
$lensImagePath = '/var/www/html/domain.com/scripts/lens-white.png';
// Загружаем изображение-иконку
$lens = new Imagick($lensImagePath);
$lensWidth = $lens->getImageWidth();
$lensHeight = $lens->getImageHeight();
// Композитим иконку на подложку в правый нижний угол
$lensX = $background->getImageWidth() - $lensWidth - 12; // 5 пикселей отступ
$lensY = $background->getImageHeight() - $lensHeight - 12; // 5 пикселей отступ
$background->compositeImage($lens, Imagick::COMPOSITE_OVER, $lensX, $lensY);
// Добавляем текст с разрешением и размером основного изображения
$draw = new ImagickDraw();
$draw->setFillColor('#FFFFFF'); // Цвет текста
$draw->setFont('/usr/share/fonts/truetype/tahoma/tahoma.ttf'); // Надежный шрифт
$draw->setFontSize(12);
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);
// Координаты текста с учетом толщины подложки
$yCoordinate = $thumbHeight + $overlayBottomHeight + $overlayTopThickness + $transparentBorderThickness - 23; // Опускаем текст вниз
// Текст с отступами
if ($fileSizeKB >= 1024) {
$fileSizeMB = number_format($fileSizeKB / 1024, 2, '.', ''); // Точное деление, 2 знака после точки
$text = "{$newWidth}x{$newHeight} [{$fileSizeMB} Mb]";
} else {
$text = "{$newWidth}x{$newHeight} [{$fileSizeKB} Kb]";
}
$background->annotateImage($draw, $overlayTopThickness + 5 + $transparentBorderThickness, $yCoordinate, 0, $text);
// Сохранение для отладки
// $background->writeImage('/tmp/test_output.png'); // Проверь вручную
return $background;
}