[PHP] Уменьшение картинки

T
На сайте с 28.06.2007
Offline
82
967

Нужно средствами PHP уменьшить картинку, но чтобы качество не сильно пострадало...

Нашёл скрипт:

<?php

$image="1.jpg"; //файл исх. изображения
$src = ImageCreateFromJpeg($image);

$bw = ImageSX($src);
$bh = ImageSY($src);

$w=100;
$h=75;

$dst = ImageCreateTrueColor($w,$h);
ImageCopyResized($dst,$src,0,0,0,0,$w,$h,$bw,$bh);

// сохраняем на диск уменьшенный рисунок
ImageJpeg($dst,"thumb_".$image, 100);

ImageDestroy($src);
ImageDestroy($dst);
?>

Но качество получаемого на выходе маленького рисунка оставляет желать лучшего :(

Может есть какие-нибудь варианты чтобы качество так сильно не страдало?

Или лучше будет воспользоваться десктопной программой?

Дмитрий
На сайте с 23.08.2006
Offline
222
#1

Попробуйте command line image resizer + exec

Разрабатываю и автоматизирую на php http://jonnyb.ru/
denex
На сайте с 29.04.2009
Offline
7
#2



<?

function createThumb($pathFromFile, $pathToFile, $type, $w)
{
if (!file_exists($pathToFile))
{
if ($type == "jpg") $image = @ImageCreateFromJPEG($pathFromFile);
if ($type == "gif") $image = @ImageCreateFromGIF($pathFromFile);
if ($type == "png") $image = @ImageCreateFromPNG($pathFromFile);

if (!$image)
{
$image = @ImageCreateFromGIF($sr . "/i/null.gif");
$null = 1;
}

$srcW = imagesx($image);
$srcH = imagesy($image);

if (($srcW > $w) && !$null)
{
if ($srcW > $srcH)
{
$dstW = $w;
$dstH = $dstW * $srcH / $srcW;
}
else
{
$dstH = $w;
$dstW = $dstH * $srcW / $srcH;
}
}
else
{
$dstW = $srcW;
$dstH = $srcH;
}

$thumbnail = imagecreatetruecolor($dstW, $dstH);

imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $dstW, $dstH, $srcW, $srcH);

if ($type == "jpg") imagejpeg($thumbnail, $pathToFile, 86);
if ($type == "gif") imagegif($thumbnail, $pathToFile);
if ($type == "png") imagepng($thumbnail, $pathToFile);

chmod($pathToFile, 0666);
}
}

?>
Создание Интернет-проектов любой сложности (социальные сети, медиа-порталы, сайты-визитки, Интернет-магазины, CMS и т.д.) (http://www.tyurin.net)
T
На сайте с 28.06.2007
Offline
82
#3

denex, огромное спасибо! Прямо то что нужно. И работает быстро и качество на выходе приличное и размер маленький.

JonnyB, denex спасибо вам!

denex
На сайте с 29.04.2009
Offline
7
#4

Trol, да не за что.

Linkpusher
На сайте с 28.12.2007
Offline
176
#5

Trol, замените в своём коде ImageCopyResized на ImageCopyResampled.

Точу ножи. Буквально. Есть отзывы. Заказать заточку в МСК и Подольске можно через Телеграмм.
T.R.O.N
На сайте с 18.05.2004
Offline
314
#6

Встроенные фбиблиотеки PHP которые он наследовал от Perl имееют небольшую производительность. Да и с качеством у них проблемы. Очень рекомендую использовать ImageMagick

http://www.imagemagick.org/script/api.php

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
R
На сайте с 13.06.2009
Offline
47
#7
denex:


<?

function createThumb($pathFromFile, $pathToFile, $type, $w)
{
if (!file_exists($pathToFile))
{
if ($type == "jpg") $image = @ImageCreateFromJPEG($pathFromFile);
if ($type == "gif") $image = @ImageCreateFromGIF($pathFromFile);
if ($type == "png") $image = @ImageCreateFromPNG($pathFromFile);

if (!$image)
{
$image = @ImageCreateFromGIF($sr . "/i/null.gif");
$null = 1;
}

$srcW = imagesx($image);
$srcH = imagesy($image);

if (($srcW > $w) && !$null)
{
if ($srcW > $srcH)
{
$dstW = $w;
$dstH = $dstW * $srcH / $srcW;
}
else
{
$dstH = $w;
$dstW = $dstH * $srcW / $srcH;
}
}
else
{
$dstW = $srcW;
$dstH = $srcH;
}

$thumbnail = imagecreatetruecolor($dstW, $dstH);

imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $dstW, $dstH, $srcW, $srcH);

if ($type == "jpg") imagejpeg($thumbnail, $pathToFile, 86);
if ($type == "gif") imagegif($thumbnail, $pathToFile);
if ($type == "png") imagepng($thumbnail, $pathToFile);

chmod($pathToFile, 0666);
}
}

?>

А это как уменьшает картинку до указанного размера: обрезает до этого размера (т.е. отсекает часть картинки) или просто сжимает?

denex
На сайте с 29.04.2009
Offline
7
#8

recrut, сжимает с минимальной потерей качества.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий