abler98
@abler98
Software Engineer

Пытаюсь сделать превью для изображения. Можете помочь?

Вот что получилось, но я думаю, что можно как-то короче и быстрее это сделать. Если что, я хочу сделать квадратную уменьшенную копию изображения
<?php

# Необходимая длина квадрата
$required_size = 64;
# Пути к исходному изображения
$src = 'root.jpg';

# Размеры исходного изображения
list($width, $height) = getimagesize($src);
# Определяем длину
$size = $width > $height ? $height : $width;
# Исходное изображение
$source = imagecreatefromjpeg($src);
# Пустое изображение с черным фоном
$image = imagecreatetruecolor($required_size, $required_size);
# Начальная точки для обрезки
$x = $width > $height ? (($width - $size) / 2) : 0;
$y = $height > $width ? (($height - $size) / 2) : 0;
# Обрезаем изображение
$crop = imagecrop($source, array('x' => $x, 'y' => $y, 'width' => $size, 'height' => $size));
# Уменьшаем до нужных размеров
imagecopyresampled($image, $crop, 0, 0, 0, 0, $required_size, $required_size, $size, $size);

# Указываем заголовок
header('Content-Type: image/png');
# Выводим изображение
imagepng($image);
# Очищаем память
imagedestroy($source);
imagedestroy($image);
imagedestroy($crop);


UPD.
Я еще не проверял с квадратным изображением, наверное нужно доработать.
  • Вопрос задан
  • 2517 просмотров
Решения вопроса 3
sayber
@sayber Куратор тега PHP
Да, я программирую на PHP и еще асинхронно!
А зачем так извращаться? Используйте imagick

Как работать с imagick

Ну и хабр конечно.
habrahabr.ru/post/43511

Маленький пример
// $target  path (полный путь до файла)
$t = new \Imagick($target);
// нужный размер
$t->ThumbnailImage(90, 90, true);
// Формат
$t->setFormat("jpg");

$t->writeImage("Куда сохранить /var/www/domen.tdl/public...");
Ответ написан
WebSpider
@WebSpider
А почему вы не хотите использовать готовые библиотеки?
Ответ написан
pi314
@pi314
Президент Солнечной системы и окрестностей
Левой пяткой через правое ухо, я бы сделал как-то так (для наглядности результат сохраняется в файл):
$src = './orig.jpg';
$trg = './thumb.jpg';

cropAndResize2Square($src, 128, $trg);

function cropAndResize2Square($originalPath, $targetSquareSide, $targetPath){

	//get original's dimension
	list($origW, $origH) = getimagesize($originalPath);

	//create images
	$srcImg = imagecreatefromjpeg($originalPath);
	$trgImg = imagecreatetruecolor($targetSquareSide, $targetSquareSide);
	
	//calculate source square position and side
	if($origW >= $origH){
		$srcSquareSide = $origH;
		$srcSquareX    = ($origW - $targetSquareSide) / 2;
		$srcSquareY    = 0;
	} else {
		$srcSquareSide = $origW;
		$srcSquareX    = 0;
		$srcSquareY    = ($origH - $targetSquareSide) / 2;
	}
	
	imagecopyresampled($trgImg, $srcImg, 
			0, 0, $srcSquareX, $srcSquareY, 
			$targetSquareSide, $targetSquareSide, $srcSquareSide, $srcSquareSide);

	//encode and save result (default quality 75%)
	imagejpeg($trgImg, $targetPath);
	
	//clean up
	imagedestroy($srcImg);
	imagedestroy($trgImg);
}

P.S. Если понадобится фильтр (например, Ланчос), лучше юзать ImageMagic. Хотя, если бешенной собаке семь верст - не крюк, можно написать и ручками. Но на PHP это будет убийственно медленно :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы