php resize image с сохранением пропорций
Labdes
В данной заметке я хочу показать очень простую функцию, которая ресайзит изображения более-менее правильно в соответствии с пропорциями оригинала и нужных нам новых размеров. Необходимость в изменении размеров частенько возникает например при изготовлении аватар или когда нам нужны превью картинок для какой-нибудь галереи.
Если рассмотреть типичные примеры функций по изменению размеров, то как правило происходит просто изменение размеров исходника таким образом, что либо сверху-снизу появляются белые полосы, либо соответственно справа-слева. В нашем же случае, если картинка вытянута по высоте, то соответственно без всяких полос она пропорционально обрежется сверху и снизу.
Если исходная картинка вытянута по ширине, то она обрежется по краям слева и справа.
Думаю проще всего посмотреть на результат работы функции по изменению размеров на PHP. Создайте два файла. Первый create.php будет принимать исходный файл и в нем же мы будем задавать выходные размеры. Второй файл, собственно и есть наша функция. Для примера будет менять размеры например для аватарки размером 100 x 100px.
Думаю у вас получится разобраться с этой функцией по изменению размеров на PHP и она действительно пригодится вам в ваших проектах, либо вы поделитесь своим вариантом, который покажется вам еще более удобным и продвинутым.
Resize image in PHP
I’m wanting to write some PHP code which automatically resizes any image uploaded via a form to 147x147px, but I have no idea how to go about it (I’m a relative PHP novice).
So far, I’ve got images uploading successfully, filetypes being recognised and names cleaned up, but I’d like to add the resize functionality into the code. For example, I’ve got a test image which is 2.3MB, and 1331×1331 in dimension, and I’d like the code to size it down, which I’m guessing will dramatically compress the filesize of the image, too.
So far, I’ve got the following:
13 Answers 13
You need to use either PHP’s ImageMagick or GD functions to work with images.
With GD, for example, it’s as simple as.
And you could call this function, like so.
From personal experience, GD’s image resampling does dramatically reduce file size too, especially when resampling raw digital camera images.
Simple Use PHP function (imagescale):
Syntax:
Example:
Step: 1 Read the file
Step: 2: Load the Image File
Step: 3: Our Life-saver comes in ‘_’ | Scale the image
Note: imagescale will work for (PHP 5 >= 5.5.0, PHP 7)
Step: 4: Save the Resized image to your desired directory.
You will also need to include this PHP file.
If you dont care about the aspect ration (i.e you want to force the image to a particular dimension), here is a simplified answer
Now let’s handle the upload part. First step, upload the file to your desired directory. Then called one of the above functions based on file type (jpg, png or gif) and pass the absolute path of your uploaded file as below:
Hope this helps someone. Check these links for more on resizing Imagick::resizeImage and imagejpeg()
I hope is will work for you.
I created an easy-to-use library for image resizing. It can be found here on Github.
An example of how to use the library:
Other features, should you need them, are:
(IMPORTANT: In the case of animation (animated webp or gif) resizing, the result will be a not animated, but resized image from the first frame! (The original animation remains intact. )
Изменение размера изображения средствами PHP
Постоянно нам приходится принимать от пользователей различные данные. Довольно часто в этих данных встречаются изображения, которые необходимо сохранить на сервере для дальнейшего использования. Для того чтобы все загруженные изображения одинаково вписывались в общий дизайн сайта, либо занимали меньше дискового пространства, нам необходимо изменять размеры изображения. Конечно, есть функции для проверки ширины и высоты, но согласитесь, будет некорректно сообщать пользователю, что изображение не подходит для вашего сайта.
На этот случай у меня есть один хороший класс под название SimpleImage, который позволяет довольно гибко изменять размеры изображения.
Теперь после того как мы поместили данный файл класса SimpleImage к себе на сервер посмотрим как его можно использовать.
Следующий участок кода загрузит изображение image.jpg, изменить его ширину до 400 пикселей и высоту до 200 пикселей, а затем сохранит как image1.jpg.
Если необходимо изменить размеры изображения, основываясь только на ширине и при этом сохранить его пропорции, то сценарий сам выберет необходимую высоту. Для этого необходимо использовать метод resizeToWidth.
Возможно вы пожелаете изменить размер в процентном соотношении от его оригинала. Для этого существует метод scale, в качестве параметра которому передаются проценты.
У данного класса есть еще один очень полезный метод output, который позволяет выводить изображения прямо в браузер, без предварительного сохранения. Данный метод может быть очень полезен при создании миниатюр.
Автор данного класса Simon Jarvis, на своем сайте предлагает следующий пример для изменения размера изображения загруженного через форму.
Вот такой очень маленький, но довольно функциональный получился класс SimpleImage, который очень пригодиться любому разработчику.
Imagick::resizeImage
(PECL imagick 2, PECL imagick 3)
Imagick::resizeImage — Масштабирует изображение
Описание
Масштабирует изображение до желаемых размеров с помощью filter.
Список параметров
Коэффициент размытия, где значение > 1 делает изображение более размытым, а значение bestfit
Необязательный параметр подгонки.
Возвращаемые значения
Список изменений
Версия | Описание |
---|---|
PECL imagick 2.1.0 | Добавлен необязательный параметр подгонки. Теперь метод поддерживает пропорциональное масштабирование. Для пропорционального масштабирования необходимо передать ноль в качестве любого параметра. |
Примеры
Пример #1 Пример использования Imagick::resizeImage()
User Contributed Notes 7 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.
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.
?>
Or, a shorter version of the same:
= new Imagick ( ‘myimage.gif’ );
The changelog comment
«2.1.0 Added optional fit parameter. This method now supports proportional scaling. Pass zero as either parameter for proportional scaling.»
is poorly structured and therefore IMO misleading. Yes for proportional scaling you pass 0 as either parameter. however this is *not* true if you use the optional fit param. When bestfit == true you must specify a *non-zero* value for both columns and rows. Note it WILL still scale proportionally e.g.
Imagick::resizeImage ( 200, 200, imagick::FILTER_LANCZOS, 1, TRUE)
will resize a 1000×750 image to 200×150
So for proportional resizing:
without «bestfit»
Imagick::resizeImage ( 200, 0, imagick::FILTER_LANCZOS, 1)
with «bestfit»
Imagick::resizeImage ( 200, 200, imagick::FILTER_LANCZOS, 1, TRUE)
In our linux environment, using resizeImage with any filter produced extremely high CPU Utilization (in the range of 40-50%) while doing batch resizing.
We switched to scaleImage, which produces similar results to FILTER_BOX, and CPU Utilization dropped to 2-3%.
Using XHProf to profile the two batch jobs showed amazing decreases in CPU Time, so if you’re doing a lot of picture resizing, it might be beneficial to use scaleImage instead of resizeImage, as it seems to be much much more efficient.
To avoid upscaling when using the «bestfit» param, check the image dimensions before resizing: