Jump to content
  • 0

Пакетное преобразование изображений (изменение холста)


volshebnyi
 Share

Question

Здравствуйте!

Уважаемые форумчане, для интернет магазина необходимо сделать квадратные изображения - 220px на 220px. Имеющиеся изображения товаров, а их около 1000 штук, имеют абсолютно разный размер и соотношения сторон. Может быть кто-то подскажет программу, которая позволит решить данную проблему - сделать из прямоугольных изображений квадратные, например, увеличить меньшую сторону до большей.

Заранее благодарю за полезные советы и решения!

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

тоже любопытно. Во всех способах, что я видел все крутится возле вычисления и операций с пропорциями и различных хитростей: либо заполнение бокса, в данном случае 220х220 белым цветом (рисунок меньше), или увеличение\уменьшение одной стороны, если она близка к исходным пропорциям, или обрезка области от верхнего левого угла, обрезка из центра и т.д. А вот если взять любую программу  и в пакетной передаче попытаться привести  ласточку (она в высоту больше же с хвостом, допустим 450х600) в квадрат, то получим пузатого снегиря. Вернее уж сначала привести по ширине\длине с сохранением пропорций, потом обрезать по высоте... но опять же - над результатом многого наверняка можно будет посмеяться) Та же ласточка будет  бесхвостая ( если приводить по ширине, то высота - 293-220 -> 73 пикселя хвоста как не бывало)

 

post.update() Ради любопытства попробовал реализовать это в xnview. Она позволяет работать с формируемым списком фильтров, применяемых к множеству. Хм.. получается, что набор фильтров для корректной работы должен зависеть еще от исходных картинок. Применил два: размер и обрезка...ну, почти... . Жаль, что нет (или спрятана) функция получения среднего размера или диапазона размера  или сводной статистики картинок в папке, знать бы чего больше и как резать.

 

легче заюзать такое  прямо на сайте, по ресайзу и thumbnail их масса... начиная от плагинов и до подключаемых библиотек на разных языках. В любом случае будет ротация товара - и делать такое вручную явно неверно. Разве в качестве НИР.

Edited by bryknyk
Link to comment
Share on other sites

  • 0

а сделать средствами php? в инете много скриптов для этого дела
1. делаем цикл, перебираем картинки по очереди, foreach например подойдет
2. беря каждую картинку анализируем:
2.1. получить размеры картинки (getimagesize($filepath))
2.2. задаем максимальный размер будущей картинки (в вашем случае $max_width = 220 и $max_height = 220)
2.3. вычисляем соотношение сторон новой и старой картинки ($x_ratio = $max_width / $width и $y_ratio = $max_height / $height) - эти отношения будут использоваться для всех последующих вычислений
2.4. дальше создаем новую картинку ( $img = imagecreatetruecolor($max_width,$max_height) ) - это будет заготовка, рабочая область в которой мы будем рисовать и работать с ней можно будет в последствии через переменную $img.

2.5. теперь нужно вычислить все смещения для функции imagecopyresampled($img, $fs, $x, $y, 0, 0, $new_width, $new_height, $width, $height);

где: 

$img - ссылка на заготовленный холст, на котором мы хотели рисовать

$fs - картинка которую мы хотим нарисовать на холсте, добыть ее можно $fs = imagecreatefromstring(file_get_contents($filepath));

$x и $y - это координаты смещения картинки

нолики не трогаем, они нас не интересуют

$new_width и $new_height - новые размеры уменьшенной картинки с учетом пропорции
$width и $height - старые размеры картинки
поехали вычислять:
если $width > $height, мы должны сделать $new_height = $max_height, а $new_width = $width * $y_ratio

если $width < $height, мы должны сделать $new_width = $max_width, а $new_height = $height * $x_ratio

$x = floor(($max_width - $new_width) / 2);
$y = floor(($max_height - $new_height) / 2);
2.6. теперь при выполнении imagecopyresampled($img, $fs, $x, $y, 0, 0, $new_width, $new_height, $width, $height); у нас получится нужная нам картинка
не забываем сохранить теперь ее по адресу $new_filepath и удалить из памяти все не нужное выбираете в каком формате хотите сохранить
imagedestroy($fs);
imagepng($img,$new_filepath,9); или imagejpeg($img,$new_filepath,100);

imagedestroy($img);

 

возможно что-то забыл, но думаю данного напутствия хватит нагуглить и сделать то, что вам нужно

 

PS кста, забыл предупредить, данная функция очень требовательна к памяти, при обработке картинки 1000x1000 вам понадобится наверно около 30мб памяти, на многих виртуальных хостах ее ограничивают, по этому картинки большего размера могут не обработаться. Была какая-то более экономная сторонняя библиотека для обработки картинок, но я ее к сожалению не помню.

Edited by Switch74
Link to comment
Share on other sites

  • 0
Я ее пол дня мучаю уже)))) Вы знаете как именно там можно это сделать?

как сказал bryknyk, там есть нюанс один, дело в том что мочь то она может, но что бы сделать картинку квадратной - ей придется фон заливать белым, а это может вам не подойти, так же она может вместо этого делать обрезку, но это тоже может вам не подойти... ))) вобщем других вариантов нет и еще пока не придумали, как из прямоугольной картинки сделать квадратную без искажения изображения.

Но есть вариант попроще - вы можете выставить размер только по ширине, или только по высоте, это зависит от того, как на сайте они будут выравниваться.

Switch74 - php для таких вещей действительно сильно затратен, а какие-то unix утилиты к примеру тоже могут не подойти, за отсутствием shell доступа, или ограничением на исполнения команд и утилит.

Link to comment
Share on other sites

  • 0

 

Я ее пол дня мучаю уже)))) Вы знаете как именно там можно это сделать?

как сказал bryknyk, там есть нюанс один, дело в том что мочь то она может, но что бы сделать картинку квадратной - ей придется фон заливать белым, а это может вам не подойти, так же она может вместо этого делать обрезку, но это тоже может вам не подойти... ))) вобщем других вариантов нет и еще пока не придумали, как из прямоугольной картинки сделать квадратную без искажения изображения.

Но есть вариант попроще - вы можете выставить размер только по ширине, или только по высоте, это зависит от того, как на сайте они будут выравниваться.

Switch74 - php для таких вещей действительно сильно затратен, а какие-то unix утилиты к примеру тоже могут не подойти, за отсутствием shell доступа, или ограничением на исполнения команд и утилит.

 

Мне подходит заливка фона белым. В закладке Canvas переюзал кучу настроек, но так ничего не получилось....к сожалению...

Link to comment
Share on other sites

  • 0

Привет всем!

Нашел эту тему в поиске. Софтинка прикольная. Помогите настроить ее. Мне нужно чтобы она добавила фон картинке и сделала ее квадратной без изменения размера изображения. Т.е. имеется картинка 200х300px. Нужно в итоге 300х300px, добавив белый фон. 
У всех картинок разные размеры, ориентация тоже разная (горизонтальная и вертикальная).

может есть что удобнее

Спасибо

Edited by 6yka
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy