Php увеличить размер изображения

Imagick::resizeImage

Масштабирует изображение до желаемых размеров с помощью filter.

Замечание: Поведение параметра bestfit было изменено в Imagick 3.0.0. До этой версии при изменении изображения размером 200×150 до 400×300 никаких операций не происходило. В Imagick 3.0.0 и далее изображение будет масштабировано до размеров 400×300, так как это наилучшим образом соответствует («best fit») данным размерам. Если используется параметр bestfit , то ширина и высота также должны быть определены.

Список параметров

Коэффициент размытия, где значение > 1 делает изображение более размытым, а значение < 1 - более резким.

Необязательный параметр подгонки.

Возвращаемые значения

В случае успешной работы возвращает true .

Список изменений

Версия Описание
PECL imagick 2.1.0 Добавлен необязательный параметр подгонки. Теперь метод поддерживает пропорциональное масштабирование. Для пропорционального масштабирования необходимо передать ноль в качестве любого параметра.

Примеры

Пример #1 Пример использования Imagick::resizeImage()

function resizeImage ( $imagePath , $width , $height , $filterType , $blur , $bestFit , $cropZoom ) //Коэффициент размытия, где значение > 1 делает изображение более размытым, а значение < 1 - более резким.
$imagick = new \ Imagick ( realpath ( $imagePath ));

$imagick -> resizeImage ( $width , $height , $filterType , $blur , $bestFit );

$cropWidth = $imagick -> getImageWidth ();
$cropHeight = $imagick -> getImageHeight ();

if ( $cropZoom ) $newWidth = $cropWidth / 2 ;
$newHeight = $cropHeight / 2 ;

$imagick -> cropimage (
$newWidth ,
$newHeight ,
( $cropWidth — $newWidth ) / 2 ,
( $cropHeight — $newHeight ) / 2
);

$imagick -> scaleimage (
$imagick -> getImageWidth () * 4 ,
$imagick -> getImageHeight () * 4
);
>

header ( «Content-Type: image/jpg» );
echo $imagick -> getImageBlob ();
>

User Contributed Notes 6 notes

Having to do alot of resizing, i needed to know the speeds of the different resize filters.
This was how long it took to resize a 5906×5906 JPEG image to 1181×1181.

FILTER_POINT took: 0.334532976151 seconds
FILTER_BOX took: 0.777871131897 seconds
FILTER_TRIANGLE took: 1.3695909977 seconds
FILTER_HERMITE took: 1.35866093636 seconds
FILTER_HANNING took: 4.88722896576 seconds
FILTER_HAMMING took: 4.88665103912 seconds
FILTER_BLACKMAN took: 4.89026689529 seconds
FILTER_GAUSSIAN took: 1.93553304672 seconds
FILTER_QUADRATIC took: 1.93322920799 seconds
FILTER_CUBIC took: 2.58396601677 seconds
FILTER_CATROM took: 2.58508896828 seconds
FILTER_MITCHELL took: 2.58368492126 seconds
FILTER_LANCZOS took: 3.74232912064 seconds
FILTER_BESSEL took: 4.03305602074 seconds
FILTER_SINC took: 4.90098690987 seconds

I ended up choosing CATROM as it has a very similar result to LANCZOS, but is significantly faster.

Some size, image and filter and blur combinations causes artifacts or even make image completely scrambled. As far, as I see, it happens with blur values smaller than 0.25 (sometimes less) and goes worse to the point of 0 — black image. Sometimes only some values gives artifacts, like Hanning with my test image: 0.0 blur is fine, 0.1 produces artefacts.

Affected filters are e.g. Catrom, sinc, cubic, quadratic, while unaffected are e.g. Lanczos and Hanning. The problem seems to be the domain of the filter algorithms, not IMagick implementation. This image shows three filters: http://i.imgur.com/HcdwoUS.jpg

Sometimes test image could look fine, but other not, so if you are using affected filters, the 0.5 value should be safe.

This test script takes example image (you can download and use http://i.imgur.com/KsTJpFr.jpg which is affected) and creates resized images in the same directory for every filter and one of four blur values, with naming like «test.jpg.sinc.0.1.jpg» for «test.jpg» input.

$imgPath = ‘imgtest/test.jpg’ ; // set your image file
$testBlurs = [ 0 , 0.1 , 0.2 , 0.5 ]; // test these blur values
$im = new IMagick ();
$im -> readImage ( $imgPath );

foreach ((new ReflectionClass ( ‘IMagick’ ))-> getConstants () as $n => $f ) if ( strncmp ( $n , ‘FILTER_’ , 7 ) === 0 ) < // get available IMagick filters
$filterName = strtolower ( substr ( $n , 7 )); // extract filter name from constant
foreach ( $testBlurs as $blur ) $imSize = clone $im ;
$imSize -> resizeImage ( 500 , 500 , $f , $blur , true );
$imSize -> writeImage ( sprintf ( «%s-%s-%.1f.jpg» , $imgPath , $filterName , $blur ));
$imSize -> destroy ();
>
>
>

Источник

Обработка изображений в PHP

Библиотека GD дает возможность работать с изображениями в PHP. Подробнее о функциях на php.net.

Далее представлены примеры как изменить размер, вырезать часть изображения и т.д. Все примеры универсальные и работают с разными типами файлов без изменений кода, у PNG файлов сохраняется прозрачность.

Открытие изображения

Итак, есть исходное изображение PNG 400x400px:

С помощью функции getimagesize() получим ширину, высоту и тип, далее откроем его функциями в зависимости от типа:

$filename = __DIR__ . '/donut.png'; $info = getimagesize($filename); $width = $info[0]; $height = $info[1]; $type = $info[2]; switch ($type)

Изменение размера изображения (resize)

Приведенный код уменьшает или увеличивает изображение не искажая его пропорции.

// Размеры новой фотки. $w = 200; $h = 0; if (empty($w)) < $w = ceil($h / ($height / $width)); >if (empty($h)) < $h = ceil($w / ($width / $height)); >$tmp = imageCreateTrueColor($w, $h); if ($type == 1 || $type == 3) < imagealphablending($tmp, true); imageSaveAlpha($tmp, true); $transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127); imagefill($tmp, 0, 0, $transparent); imagecolortransparent($tmp, $transparent); >$tw = ceil($h / ($height / $width)); $th = ceil($w / ($width / $height)); if ($tw < $w) < imageCopyResampled($tmp, $img, ceil(($w - $tw) / 2), 0, 0, 0, $tw, $h, $width, $height); >else < imageCopyResampled($tmp, $img, 0, ceil(($h - $th) / 2), 0, 0, $w, $th, $width, $height); >$img = $tmp;

Результат

$w = 200;
$h = 0;
$w = 200;
$h = 100;
$w = 100;
$h = 200;

Обрезать изображение (crop)

Пример вырезает из исходного изображения часть размером $w на $h .
$x и $y задают начальные координаты в пикселях или процентах.

$w = 200; $h = 200; $x = '100%'; $y = '100%'; if (strpos($x, '%') !== false) < $x = intval($x); $x = ceil(($width * $x / 100) - ($w / 100 * $x)); >if (strpos($y, '%') !== false) < $y = intval($y); $y = ceil(($height * $y / 100) - ($h / 100 * $y)); >$tmp = imageCreateTrueColor($w, $h); if ($type == 1 || $type == 3) < imagealphablending($tmp, true); imageSaveAlpha($tmp, true); $transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127); imagefill($tmp, 0, 0, $transparent); imagecolortransparent($tmp, $transparent); >imageCopyResampled($tmp, $img, 0, 0, $x, $y, $width, $height, $width, $height); $img = $tmp;

Результат

$x = 0;
$y = 0;
$x = ‘50%’;
$y = ‘0%’;
$x = ‘100%’;
$y = ‘0%’;

Поворот изображения

Функция imagerotate() поворачивает изображение на заданный угол против часовой стрелки, отрицательный угол меняет направление поворота.

// Поворот против часовой стрелки на 45°. $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127); $img = imagerotate($img, 45, $transparent); // Поворот по часовой стрелки на 90° $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127); $img = imagerotate($img, -90, $transparent);

Поворот на не ровный угол увеличит ширину и высоту фото:

Зеркальное отражение

imageflip($img, IMG_FLIP_HORIZONTAL);

Imageflip() зеркалит изображение, могут быть следующие параметры:

IMG_FLIP_HORIZONTAL По горизонтали
IMG_FLIP_VERTICAL По вертикали
IMG_FLIP_BOTH По горизонтали и вертикали

Добавление фона

Актуально для PNG с прозрачностью. Скрипт вставит на задний фон картинку с положением $x и $y . Размер основного изображения не изменится.

$file = __DIR__ . '/donut_bg.jpg'; // Положение фона. $x = '50%'; $y = '50%'; $info = getimagesize($file); switch ($info[2]) < case 1: $bg = imageCreateFromGif($file); break; case 2: $bg = imageCreateFromJpeg($file); break; case 3: $bg = imageCreateFromPng($file); break; >if (strpos($x, '%') !== false) < $x = intval($x); $x = ceil(($info[0] * $x / 100) - ($width / 100 * $x)); >if (strpos($y, '%') !== false) < $y = intval($y); $y = ceil(($info[1] * $y / 100) - ($height / 100 * $y)); >$tmp = imageCreateTrueColor($width, $height); imagecopy($tmp, $bg, 0, 0, $x, $y, $width, $height); imagedestroy($bg); imagecopy($tmp, $img, 0, 0, 0, 0, $width, $height); $img = $tmp;

Фильтры

imagefilter($img, $filtertype, $arg1, $arg2);

Функция imagefilter() применяет фильтр к изображению.
В параметре $filtertype указывается константа применяемого фильтра, а в следующих его настройки.

IMG_FILTER_NEGATE

Инвертирует цвета изображения.

imagefilter($img, IMG_FILTER_NEGATE);

IMG_FILTER_GRAYSCALE

Преобразует цвета изображения в градации серого.

imagefilter($img, IMG_FILTER_GRAYSCALE);

IMG_FILTER_COLORIZE

Преобразует цвета изображения в градации заданного цвета в формате RGB.

// Красный imagefilter($img, IMG_FILTER_COLORIZE, 0, 240, 120); // Синий imagefilter($img, IMG_FILTER_COLORIZE, 150, 240, 120); // Зеленый imagefilter($img, IMG_FILTER_COLORIZE, 90, 240, 90);
0, 240, 120
150, 240, 120
90, 240, 90

IMG_FILTER_BRIGHTNESS

Изменяет яркость изображения, диапазон от -255 до 255.

imagefilter($img, IMG_FILTER_BRIGHTNESS, 127);
-200
-100
100
200

IMG_FILTER_CONTRAST

Изменяет контрастность изображения. Уровень может быть от -100 до 100.

imagefilter($img, IMG_FILTER_CONTRAST, 100);
-100
-50
50
100

IMG_FILTER_EDGEDETECT

Использует определение границ для их подсветки.

imagefilter($img, IMG_FILTER_EDGEDETECT);

IMG_FILTER_EMBOSS

imagefilter($img, IMG_FILTER_EMBOSS);

IMG_FILTER_GAUSSIAN_BLUR

Размывает изображение по методу Гаусса.

imagefilter($img, IMG_FILTER_GAUSSIAN_BLUR);

IMG_FILTER_SELECTIVE_BLUR

Как и IMG_FILTER_GAUSSIAN_BLUR размывает изображение.

imagefilter($img, IMG_FILTER_SELECTIVE_BLUR);

IMG_FILTER_MEAN_REMOVAL

imagefilter($img, IMG_FILTER_MEAN_REMOVAL);

IMG_FILTER_SMOOTH

Делает границы более плавными, а изображение менее четким. Диапазон значений не ограничен, но наиболее заметные изменения происходят от 0 до -8.

imagefilter($img, IMG_FILTER_SMOOTH, -2);
0
-2
-4
-6

IMG_FILTER_PIXELATE

Применяет эффект пикселирования.

arg1 – задает размера блока в пикселях.
arg2 – включает усовершенствованный эффект пикселирования.

imagefilter($img, IMG_FILTER_PIXELATE, 2, true);
2
3
4
5

Сохранение

Вывод изображения в браузер

До вызова функции header() скрипт ничего не должен выводить ( echo , ?>.

switch ($type) < case 1: header('Content-Type: image/gif'); imageGif($img); break; case 2: header('Content-Type: image/jpeg'); imageJpeg($img, null, 100); break; case 3: header('Content-Type: image/x-png'); imagePng($img); break; >imagedestroy($img); exit();

Чтобы браузер отдал фото на скачивание, в начало кода нужно добавить заголовок:

header('Content-Disposition: Attachment;filename=' . basename($src)); 

Сохранение изображения в файл на сервере

switch ($type) < case 1: imageGif($img, $src); break; case 2: imageJpeg($img, $src, 100); break; case 3: imagePng($img, $src); break; >imagedestroy($img);

Вывод в браузер и сохранение в файл

switch ($type) < case 1: header('Content-Type: image/gif'); imageGif($img, $src); break; case 2: header('Content-Type: image/jpeg'); imageJpeg($img, $src, 100); break; case 3: header('Content-Type: image/x-png'); imagePng($img, $src); break; >imagedestroy($img); readfile($src); exit();

Источник

Читайте также:  Php with class and objects
Оцените статью