|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 64412.9489 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
21.05.2010, 14:31
|
#1
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,230
Бабло: $247845891
|
масштабирование/обрезание пикчи php
Нужно сделать изменение размера изображения до определенного фиксированного путем масштабирования и обрезания лишних частей. Может есть у кого готовая функция?
|
|
|
21.05.2010, 16:15
|
#2
|
Читатель
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
|
Вот набросал вариант, когда необходимо "вписать" картинку в квадрат нужного размера по меньшей стороне картинки с центрированием и обрезанием выступающих краев большей стороны.
PHP код:
$SIZE = 200; // Размер стороны квадрата
$IMGFILE = 'path/to/img.jpeg';
list($width, $height) = getimagesize($IMGFILE);
$xk = $yk = 0;
if($width > $height) {
$src_size = $height;
$xk = ($width - $height) / 2;
} else {
$src_size = $width;
$yk = ($height - $width) / 2;
}
$img1 = imagecreatefromjpeg($IMGFILE);
$img2 = imagecreatetruecolor($SIZE, $SIZE);
imagecopyresampled($img2, $img1, 0, 0, $xk, $yk, $SIZE, $SIZE, $src_size, $src_size);
// Тут можно вывести, а можно и сохранить...
header('Content-type: image/jpeg');
imagejpeg($img2);
|
|
|
21.05.2010, 16:16
|
#3
|
Nothing can stop me now
Регистрация: 09.05.2007
Адрес: Ukraine
Сообщений: 44
Бабло: $7885
|
Вот
_ttp://shiftingpixel.com/2008/03/03/smart-image-resizer/
|
|
|
21.05.2010, 16:18
|
#4
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,230
Бабло: $247845891
ТС -->
|
ТС
спасибо
а если не только квадрат, намного сложнее будет?
Цитата:
Вот
_ttp://shiftingpixel.com/2008/03/03/smart-image-resizer/
|
ну тут скрипт каждый раз будет срабатывать... не будет неоправданно большой нагрузки?
|
|
|
21.05.2010, 16:41
|
#5
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
imagecopyresampled - херово работает при уменьшении масштабов, резкость увеличивается. я после нее этим размываю: http://bddl.googlecode.com/svn/trunk...k.function.php
Цитата:
не будет неоправданно большой нагрузки?
|
конечно изврат, кеш нужен полюбому.
Если что-то оптом редактировать, то лучше imagemagick - мегаизвестная софтина под никс, частенько просили ее использовать вместо php-gd, вызов также из php через exec()
|
|
|
21.05.2010, 16:47
|
#6
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,230
Бабло: $247845891
ТС -->
|
ТС
ну там есть какой-то кеш
без кеша конечно вообще тупо
|
|
|
21.05.2010, 17:02
|
#7
|
Nothing can stop me now
Регистрация: 09.05.2007
Адрес: Ukraine
Сообщений: 44
Бабло: $7885
|
да, там кеш есть
|
|
|
21.05.2010, 17:04
|
#8
|
Читатель
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
|
Цитата:
Сообщение от chesser
Если что-то оптом редактировать, то лучше imagemagick - мегаизвестная софтина под никс, частенько просили ее использовать вместо php-gd, вызов также из php через exec()
|
Через ехес медленно очень (тестил), надо нативный экстеншн использовать - imagick.
|
|
|
21.05.2010, 17:09
|
#9
|
Senior Member
Регистрация: 27.10.2008
Сообщений: 758
Бабло: $94811
|
Цитата:
Сообщение от imgreen
Нужно сделать изменение размера изображения до определенного фиксированного путем масштабирования и обрезания лишних частей. Может есть у кого готовая функция?
|
От сердца отрываю
PHP код:
<?php
/**
* @author Kavopero
* @copyright 2009
*/
$dir='C:\\WebServers\\home\\script.com\\www\\gpic\\img\\';
$pics=scandir($dir);
print_r($pics);
$ds=250; //ширина нового изображения
for ($w=0;$w<count($pics);$w++)
{
$prefix = mt_rand(100,999);
if (false !== strpos($pics[$w],'.jpg'))
{
$im = @imagecreatefromjpeg ($dir.$pics[$w]);
$size=getimagesize($dir.$pics[$w]);
$fac=$size[0]/$size[1];
if ($size[0]>$ds) $w_dest=$ds;
else $w_dest=$size[0]-10;
$h_dest=$w_dest/$fac;
$dest = imagecreatetruecolor($w_dest,$h_dest);
imagecopyresized($dest, $im, 0, 0, 0, 0, $w_dest, $h_dest, $size[0], $size[1]);
imagejpeg($dest,$dir.$prefix.$pics[$w]);
imagedestroy($dest);
imagedestroy($im);
}
elseif (false !== strpos($pics[$w],'.gif'))
{
$im = @imagecreatefromgif ($dir.$pics[$w]);
$size=getimagesize($dir.$pics[$w]);
$fac=$size[0]/$size[1];
if ($size[0]>$ds) $w_dest=$ds;
else $w_dest=$size[0]-10;
$h_dest=$w_dest/$fac;
$dest = imagecreatetruecolor($w_dest,$h_dest);
imagecopyresized($dest, $im, 0, 0, 0, 0, $w_dest, $h_dest, $size[0], $size[1]);
imagegif($dest,$dir.$prefix.$pics[$w]);
imagedestroy($dest);
imagedestroy($im);
}
elseif (false !== strpos($pics[$w],'.png'))
{
$im = @imagecreatefrompng ($dir.$pics[$w]);
$size=getimagesize($dir.$pics[$w]);
$fac=$size[0]/$size[1];
if ($size[0]>$ds) $w_dest=$ds;
else $w_dest=$size[0]-10;
$h_dest=$w_dest/$fac;
$dest = imagecreatetruecolor($w_dest,$h_dest);
imagecopyresized($dest, $im, 0, 0, 0, 0, $w_dest, $h_dest, $size[0], $size[1]);
imagepng($dest,$dir.$prefix.$pics[$w]);
imagedestroy($dest);
imagedestroy($im);
}
}
?>
|
|
|
21.05.2010, 17:18
|
#10
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от dveredel
Через ехес медленно очень (тестил), надо нативный экстеншн использовать - imagick.
|
возможно это тормозила связка php<->console, т.е. инициализация exec. И если пускать в exec пачкой, то нормально должно быть. Может еще какие факторы окружающей системы влияли.
Ну смысл тут понятен, а как запускать - это второстепенно.
|
|
|
|