Изображения

Kohana предоставляет класс для обработки изображений. Обработка осуществляется посредством библиотеки GDlib, а начиная с версии Kohana 3.2, также доступен и ImageMagick.

Использование

Чтобы начать работу с изображением, необходимо вызвать метод Image::factory($file, $driver), где $file — путь до изображения, $driver — драйвер (необязательно), через который будет вестись работа с изображением (GD или ImageMagick):

$image = Image::factory('/Users/delphist/Pictures/DSC_5171.JPG', 'ImageMagick');

После этого, для $image доступны следующие переменные:

  • $width — ширина изображения
  • $height — высота изображения
  • $mimeMIME-тип изображения

Например:

echo 'Размер изображения: '.$image->width.'x'.$image->height.' px';

Чтобы получить cгенерированное изображение (например, чтобы вывести его в браузер / сохранить в базу), используйте метод render($type, $quality), где $type — тип изображения (png, jpg или gif) и $quality — качество изображения (1-100), например:

echo $image->render('gif');

Для сохранения файла используется метод save($file, $quality), где $file — имя сохраняемого файла (оставьте NULL, чтобы перезаписать существующий), и $quality — качество сохраняемого файла (1-100):

Image::factory('/Users/delphist/Pictures/DSC_5171.JPG')->save('/Users/delphist/Pictures/_badquality_DSC_5171.JPG', 20);

Изменение размеров

Для изменения размеров изображения используется метод resize($width, $height, $master), где $width и $height — новые размеры изображения, а $master — способ изменения размера.

$master может принимать следующие значения:

  • Image::AUTO (по умолчанию) — Изображение изменяет размер согласно пропорции
  • Image::NONE — Изображение изменяется точно в заданные размеры (игнорируя пропорцию).
  • Image::WIDTH — Ширина изображения изменяется в точно заданный размер, а высота согласно пропорции.
  • Image::HEIGHT — Высота изображения изменяется в точно заданный размер, а ширина согласно пропорции.

Пересжатие изображения до точных размеров в 32x32

$image->resize(32, 32, Image::NONE);

Пересжатие изображения согласно пропорции до размеров 100x100:

$image->resize(100, 100, Image::AUTO);

Обрезание изображения

Для обрезания изображения используется метод crop($width, $height, $offset_x, $offset_y), где $width и $height — размеры обрезаемого участка, $offset_x, $offset_y — координаты обрезаемого участка. Если координата не указана (установлена в NULL), то будет использован центр оси, если она установлена в TRUE, то будет использован конец оси.

Обрезать изображение до 200x200 в центре:

$image->crop(200, 200);

Обрезать изображение до 100x100 в правом нижнем углу:

$image->crop(100, 100, TRUE, TRUE);

Обрезать изображение до 100x100 внизу-в центре:

$image->crop(100, 100, NULL, TRUE);

Обрезать изображение до 100x100 наверху-в центре:

$image->crop(100, 100, NULL, 0);

Практическое использование

Создание превью (thumbnail) изображения

// Путь до оригинального файла
$filename = '/Users/delphist/Pictures/picture.jpg';
// Имя превью-изображения
$thumbnail_filename = pathinfo($filename, PATHINFO_DIRNAME).'/thumbnail_'.pathinfo($filename, PATHINFO_BASENAME);
// Пересжимаем и сохраняем изображение
Image::factory($filename)
	->resize(200, 200, Image::AUTO)
	->save($thumbnail_filename, 80);

Наложение водяного знака (watermark) на изображение

// Путь до оригинального файла
$filename = '/Users/delphist/Pictures/picture.jpg';
// Изображение с водяным знаком
$watermark_filename = '/Users/delphist/Pictures/watermark.png';
// Загружаем изображения
$image = Image::factory($filename);
$watermark = Image::factory($watermark_filename);
// Вставляем водяной знак в изображение
$image->watermark($watermark, TRUE, TRUE, 30)->save();

Масштабирование изображения до точных размеров

Иногда требуется сжать картинку до точных размеров. Как это сделать, соблюдая пропорцию? Единственный выход — обрезать «непропорциональные» края картинки.

// Размеры, до которых будем обрезать
$size_width = 100;
$size_height = 200;
// Открываем изображение
$image = Image::factory($file);
// Подсчитываем соотношение сторон картинки
$ratio = $image->width / $image->height;
// Соотношение сторон нужных размеров
$original_ratio = $size_width / $size_height;
// Размеры, до которых обрежем картинку до масштабирования
$crop_width = $image->width;
$crop_height = $image->height;
// Смотрим соотношения
if($ratio > $original_ratio)
{
	// Если ширина картинки слишком большая для пропорции,
	// то будем обрезать по ширине
	$crop_width = round($original_ratio * $crop_height);
}
else
{
	// Либо наоборот, если высота картинки слишком большая для пропорции,
	// то обрезать будем по высоте
	$crop_height = round($crop_width / $original_ratio);
}
// Обрезаем по высчитанным размерам до нужной пропорции
$image->crop($crop_width, $crop_height);
// Масштабируем картинку то точных размеров
$image->resize($size_width, $size_height, Image::NONE);
// Сохраняем изображение в файл
$image->save();

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *