Скрипт для создания превью.

Навигатор
На сайте с 15.07.2006
Offline
156
1661

Коллеги, пытался создать скрипт, который бы создавал из картинки 1.jpg превьюшку 2.jpg

Все как бы работает, но качество архихреновое. Знаю что как то делают много лучше.

Как его можно доделать? И будет ли нормально работать не только с JPEG, но и GIF ?

Заранее благодарен за советы.

$old = imageCreateFromJpeg("1.jpg");

$w = imageSX($old);
$h = imageSY($old);
$k=$w / 200;
$w_new=round($w/$k);
$h_new=round($h/$k);
$new = imageCreate($w_new, $h_new);
imageCopyResized($new, $old, 0, 0, 0, 0, $w_new, $h_new, $w, $h);
imageJpeg($new, "2.jpg");
imageDestroy($old);
imageDestroy($new);
Шерегеш (http://gesh.info/) - зимний горнолыжный курорт
artoodetoo
На сайте с 25.09.2008
Offline
43
#1

про качество картинки на выходе:

1) imagejpeg() имеет еще один параметр - качество JPEG в процентах. можешь поставть что-то > дефолтных 75. типа imageJpeg($new, "2.jpg", 90);

2) вместо imageCopyResized можешь попробовать imageCopyResampled - боле качественный результат, но дольше работает. при массовом производстве может иметь значение

3) мне попадался пример создания качественных превью, где картинка приводилась к нужному размеру в несколько приемов, т.е. в цикле вызывался imagecopyresampled для все меньшего и меньшего размера. так картинка меньше замыливается. опятьже времени может не хватить, поставь перед всем этим settimelimit(nnnnn)

"будет ли нормально работать не только с JPEG, но и GIF" -- поставь imageCreateFromGIF вместо imageCreateFromJpeg и будет тебе щастье!

DI
На сайте с 03.01.2007
Offline
123
#2

а еще лучше использовать imagemagick, если сервер свой - то оптимальный вариант.

Высказывание идиотского утверждения требует на порядок меньше усилий, чем его последовательное и обоснованное опровержение и более того, иногда это опровержение вообще невозможно. © (http://zhurnal.lib.ru/s/shapiro_m_a/raspidiota.shtml)
[Удален]
#3

Навигатор проблема с качеством решается заменой функции imageCopyResized на imagecopyresampled просто тупо замени и будет хорошее качество

KosoyRoman добавил 03.10.2008 в 22:14

define ("MAX_SIZE","1000");
define ("WIDTH","200");
define ("HEIGHT","150");
function make_thumb($img_name,$filename,$new_w,$new_h)
{
$ext=getExtension($img_name);
if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext))
$src_img=imagecreatefromjpeg($img_name);
if(!strcmp("png",$ext))
$src_img=imagecreatefrompng($img_name);
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
$ratio1=$old_x/$new_w;
$ratio2=$old_y/$new_h;
if($ratio1>$ratio2) {
$thumb_w=$new_w;
$thumb_h=$old_y/$ratio1;
}
else {
$thumb_h=$new_h;
$thumb_w=$old_x/$ratio2;
}
$dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
if(!strcmp("png",$ext))
imagepng($dst_img,$filename);
else
imagejpeg($dst_img,$filename);
imagedestroy($dst_img);
imagedestroy($src_img);
}
function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
$errors=0;
if(isset($_POST['Submit']))
{
$image=$_FILES['image']['name'];
if ($image)
{
$filename = stripslashes($_FILES['image']['name']);
$extension = getExtension($filename);
$extension = strtolower($extension);
if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png"))
{
echo '';
$errors=1;
}
else
{
$size=getimagesize($_FILES['image']['tmp_name']);
$sizekb=filesize($_FILES['image']['tmp_name']);
if ($sizekb > MAX_SIZE*2048)
{
echo '';
$errors=1;
}
$image_name=time().'.'.$extension;
$newname="../images/".$image_name;
$copied = copy($_FILES['image']['tmp_name'], $newname);
if (!$copied)
{
echo '';
$errors=1;
}
else
{
$thumb_name='../images/thumbs/thumb_'.$image_name;
$thumb=make_thumb($newname,$thumb_name,WIDTH,HEIGHT);
}} }}

$newname = нормальное фото

$thumb_name - трамб

Навигатор
На сайте с 15.07.2006
Offline
156
#4

Друзья, спасибо за подсказки. Но что-то не получается. Точнее получается вот что:

Итак, есть исходный "кошак" 800*600 размером 128 кб:

Стоит задача сделать превью с шириной 200.

Фотошоп с этой задачей справляется отлично и я думаю к этому качеству и надо стремиться:

(28 кб правда, но оно того стоит)

Теперь беру свой первоначальный скрипт (в первом посте) и делаю превью:

(4 кб всего но и качества как бы нет)

Теперь ставлю качество "100" в функции imagejpeg()

Размер подскакивает в разы, а качество не меняется:

Затем меняю функцию imageCopyResized() на imagecopyresampled() и в итоге картинка совсем не меняется - ни внешне, ни размером:

Еще я попробовал разделить операцию на 4 этапа, тоесть постепенно уменьшать размеры. Результат превзошел все ожидания :)

Что же тут не так ?

DyaDya
На сайте с 11.04.2007
Offline
147
#5

$new = imageCreate($w_new, $h_new);

нужно заменить на труколор!!!!!!

$new = ImageCreateTrueColor($w_new, $h_new);

---

про imagecopyresampled уже сказали, но всё равно не забудьте)

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
Навигатор
На сайте с 15.07.2006
Offline
156
#6

Вах-вах-вах :)

Большое спасибо!

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