Author |
Message |
tribesman
Заглянувший
Joined: 18 Oct 2004
Posts: 6
Карма: 0 поощрить/наказать
|
Posted: Mon Oct 18, 2004 12:01 pm (написано за 29 секунд)
Post subject: ресайз картинок
|
|
порой тоже оч удобно пользоваться Code (php): | скопировать код в буфер обмена | //функция изменения размера /* параметры 1 ширина (если 0 привязывать к высоте) 2 высота (если 0 привязывать к ширине) resize_img (350 ,0 ,0, ''); */ function resize_img($file, $newfile, $width, $height){ $img = getimagesize (www.php.net/getimagesize)($file); list($width_img, $height_img, $type_img, $attr_img) = getimagesize (www.php.net/getimagesize)($file); if ($width==0){ $destHeight = $height; $destWidth = $width_img/($height_img/$destHeight) ; }elseif ($height==0){ $destWidth= $width; $destHeight = $height_img/($width_img/$destWidth) ; } if( function_exists (www.php.net/function_exists) ('ImageCreateTrueColor') )$thumb = ImageCreateTrueColor($destWidth, $destHeight); else $thumb = imagecreate( $destWidth, $destHeight); $err = 0; if($type_img==1){ if(function_exists (www.php.net/function_exists) ('imagecreatefromgif')){ $image = imagecreatefromgif($file); imagecopyresized ($thumb, $image, 0, 0, 0, 0, ($destWidth+1), ($destHeight+1), $img[0], $img[1]); }else $err = 1; } if($type_img==2){ if(function_exists (www.php.net/function_exists) ('ImageCreateFromJpeg')){ $image = ImageCreateFromJpeg($file); imagecopyresized ($thumb, $image, 0, 0, 0, 0, ($destWidth+1), ($destHeight+1), $img[0], $img[1]); }else $err = 1; } elseif($type_img==3){ if(function_exists (www.php.net/function_exists) ('ImageCreateFromPng')){ $image = ImageCreateFromPng($file); imagecopyresized ($thumb, $image, 0, 0, 0, 0, ($destWidth+1), ($destHeight+1), $img[0], $img[1]); }else $err = 1; } if($type_img==2 and $err!=1 )ImageJpeg($thumb, $newfile); elseif($type_img==1 and $err!=1 )imagegif($thumb, $newfile); elseif($type_img==3 and $err!=1 )ImagePng($thumb, $newfile); else copy (www.php.net/copy)($file, $newfile); ImageDestroy($thumb); } |
|
|
Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8642
Карма: 197 поощрить/наказать
Location: 007 495
|
Posted: Mon Oct 18, 2004 7:10 pm (спустя 7 часов 8 минут; написано за 42 секунды)
Post subject:
|
|
tribesman:
Можно ввести еще один аргумент типа «$useresampled», и использовать при значении true фукнцию imagecopyresampled вместо функции imagecopyresized - картинки получаются намного лучшего качества.
|
|
Back to top |
|
 |
Евгений Галашин
Модератор

Joined: 29 Dec 2003
Posts: 1861
Карма: 32 поощрить/наказать
|
Posted: Mon Oct 18, 2004 7:38 pm (спустя 27 минут; написано за 3 минуты 44 секунды)
Post subject:
|
|
tribesman:
Учтите, что некоторые версии GD умеют только читать, скажем, GIF, но не писать. У Вас же — если умеет читать, значит должно и писать, что не есть так. Далее, я не очнь понимаю, зачем одну и ту же строчку:писать три раза. И ещё: о типе boolean и о логических выражениях вообще Вы слышали? Зачем делать $err!=1, да ещё три раза? И switch не проще ли было использовать?
|
|
Back to top |
|
 |
Чебурген
Участник форума
Joined: 05 Sep 2004
Posts: 129
Карма: -36 поощрить/наказать
|
Posted: Mon Oct 18, 2004 7:42 pm (спустя 3 минуты; написано за 3 минуты 22 секунды)
Post subject:
|
|
Я бы сделал такое замечание. Во всех приведенных программах очень много повторяющегося кода. Их можно сократить в половину, а главное - в разы упростить внесение правок. Я уж не говорю об элегантном вызове ImageCreateFrom* через $function(), но хотя бы imagecopyresized можно было написать один раз?
|
|
Back to top |
|
 |
tribesman
Заглянувший
Joined: 18 Oct 2004
Posts: 6
Карма: 0 поощрить/наказать
|
Posted: Mon Oct 18, 2004 8:42 pm (спустя 1 час 27 секунд; написано за 28 секунд)
Post subject:
|
|
Чебурген wrote: |
Я бы сделал такое замечание. Во всех приведенных программах очень много повторяющегося кода. Их можно сократить в половину, а главное - в разы упростить внесение правок. Я уж не говорю об элегантном вызове ImageCreateFrom* через $function(), но хотя бы imagecopyresized можно было написать один раз? | исправлюсь.
|
|
Back to top |
|
 |
tribesman
Заглянувший
Joined: 18 Oct 2004
Posts: 6
Карма: 0 поощрить/наказать
|
Posted: Mon Oct 18, 2004 9:46 pm (спустя 1 час 4 минуты; написано за 47 секунд)
Post subject:
|
|
немного исправил Code (php): | скопировать код в буфер обмена | function resize_img($file, $newfile, $width, $height){ list($width_img, $height_img, $type_img, $attr_img) = getimagesize (www.php.net/getimagesize)($file); if ($width==0){ $destHeight = $height; $destWidth = $width_img/($height_img/$destHeight) ; }elseif ($height==0){ $destWidth= $width; $destHeight = $height_img/($width_img/$destWidth) ; } if( function_exists (www.php.net/function_exists) ('ImageCreateTrueColor') )$thumb = ImageCreateTrueColor($destWidth, $destHeight); else $thumb = imagecreate( $destWidth, $destHeight); switch ($type_img){ case '1'; if( resize_img_tst('ImageCreateFromGif', $file, $thumb, $destWidth, $destHeight, $width_img, $height_img) ) ImageGif($thumb, $newfile); else copy (www.php.net/copy)($file, $newfile); break; case '2'; if( resize_img_tst('ImageCreateFromJpeg', $file, $thumb, $destWidth, $destHeight, $width_img, $height_img) ) ImageJpeg($thumb, $newfile); else copy (www.php.net/copy)($file, $newfile); break; case '3'; if( resize_img_tst('ImageCreateFromPng', $file, $thumb, $destWidth, $destHeight, $width_img, $height_img) ) ImagePng($thumb, $newfile); else copy (www.php.net/copy)($file, $newfile); break; default: copy (www.php.net/copy)($file, $newfile); break; } ImageDestroy($thumb); } function resize_img_tst($format, $file, $thumb, $destWidth, $destHeight, $width_img, $height_img){ if( function_exists (www.php.net/function_exists)($format) ){ $image = $format($file); if( function_exists (www.php.net/function_exists)('imagecopyresampled') ) imagecopyresampled($thumb, $image, 0, 0, 0, 0, ($destWidth+1), ($destHeight+1), $width_img, $height_img); else imagecopyresized($thumb, $image, 0, 0, 0, 0, ($destWidth+1), ($destHeight+1), $width_img, $height_img); return true; }else return false; } |
|
|
Back to top |
|
 |
Евгений Галашин
Модератор

Joined: 29 Dec 2003
Posts: 1861
Карма: 32 поощрить/наказать
|
Posted: Mon Oct 18, 2004 10:13 pm (спустя 27 минут; написано за 18 секунд)
Post subject:
|
|
Вы что, смеётесь??
|
|
Back to top |
|
 |
Чебурген
Участник форума
Joined: 05 Sep 2004
Posts: 129
Карма: -36 поощрить/наказать
|
Posted: Mon Oct 18, 2004 11:25 pm (спустя 1 час 11 минут; написано за 7 минут 58 секунд)
Post subject:
|
|
tribesman:
где были - ровно там и остались. Имеем ТРИ куска совершенно идентичного кода. Неужели так трудно свести его к одному? Вынести кейс за пределы кода? Если кейс влияет только на одну переменную, то зачем ему внутрь пихать куски совершенно одинакового кода? Откуда вынесены такие навыки программирования? Функция эта, resize_img_tst - тоже совершенно лишняя. Все делается парой управляющих операторов. Тут кода-то - на десяток строк! Определил, есть ли нужныые функции, вбил их в переменные, а дальше нарисовал ОДИН кусок кода, который подставляет переменные имена функций. И ВСЕ! А здесь от этих $file, $thumb, $destWidth - в глазах рябит! Все эти параметры указываются ОДИН раз! Кейс тут тоже не нужен. Вполне достаточно массива, где индексами будут типы, возвращаемые getimagesize, а значениями - имена функций. так безо всякого кейса мы получаем имя функции ImageCreateFrom*
Last edited by Чебурген on Mon Oct 18, 2004 11:54 pm; edited 1 time in total
|
|
Back to top |
|
 |
Ant
Сотрудник «Лаборатории»

Joined: 17 Jun 2003
Posts: 6840
Карма: 129 поощрить/наказать
|
Posted: Mon Oct 18, 2004 11:37 pm (спустя 12 минут)
Post subject:
|
|
|
|
Back to top |
|
 |
Дмитрий Котеров
Администратор

Joined: 10 Mar 2003
Posts: 13665
Карма: 413 поощрить/наказать
|
Posted: Tue Oct 19, 2004 10:40 am (спустя 11 часов 3 минуты; написано за 2 минуты 13 секунд)
Post subject:
|
|
Имя функции можно занести в переменную, и потом вызывать: Code (php): | скопировать код в буфер обмена | $types = array (www.php.net/array)(1=>"gif", 2=>"jpeg", 3=>"png"); $func = "imagecreatefrom".$types[$format]; ... if (function_exists (www.php.net/function_exists)($func)) $func(...); else copy (www.php.net/copy)(...); |
|
|
Back to top |
|
 |
deMone
Участник форума

Joined: 03 May 2004
Posts: 90
Карма: 6 поощрить/наказать
Location: из России
|
Posted: Mon Oct 25, 2004 3:47 pm (спустя 6 дней 5 часов 6 минут; написано за 18 секунд)
Post subject: Немного другой вариант
|
|
А вот мой вариант. Сделан давно, используется часто. Пример использования: gymn3.org.ru/photogallery/ Code (php): | скопировать код в буфер обмена | <? // // // // // // // //
if (!$image or !file_exists (www.php.net/file_exists)($image)) { $im=imagecreate($w, $h); $c1=imagecolorallocate($im, 255, 255, 255); $c2=imagecolorallocate($im, 0, 0, 0); imagecolortransparent ($im, $c1); imagerectangle ($im, 0, 0, $w-1, $h-1, $c2); imagestring ($im, 2, 5, 5, "image", $c2); imagestring ($im, 2, 5, 15, "not", $c2); imagestring ($im, 2, 5, 25, "found", $c2); header (www.php.net/header) ("content-type: image/png"); imagepng($im); return; } $arr=getImageSize (www.php.net/getimagesize)($image); $imW = $arr[0]; $imH = $arr[1]; $imT = $arr[2]; if ($imT==2) header (www.php.net/header) ("content-type: image/jpeg"); else header (www.php.net/header) ("content-type: image/png");
if (!$w and !$h) { $w=150; if ($imW==$imH) { $imageWidth=$w; $imageHeight=$h; } if ($imW>$imH) { $imageWidth=$w; $imageHeight=round (www.php.net/round)($imH/($imW/$w)); } if ($imH>$imW) { $imageHeight=$h; $imageWidth=round (www.php.net/round)($imW/($imH/$h)); } } else { if ($w==$h) { $imageWidth=$w; $imageHeight=$h; } if ($w>$h) { $imageWidth=$w; $imageHeight=round (www.php.net/round)($imH/($imW/$w)); } if ($h>$w) { $imageHeight=$h; $imageWidth=round (www.php.net/round)($imW/($imH/$h)); } }
$im2=imagecreatetruecolor ($imageWidth, $imageHeight);
if ($imT==1) { if (function_exists (www.php.net/function_exists)("imagecreatefromgif")) { $im=imagecreatefromgif ($image); } else { $im=imagecreate($w, $h); $c1=imagecolorallocate($im, 255, 255, 255); $c2=imagecolorallocate($im, 0, 0, 0); imagecolortransparent ($im, $c1); imagerectangle ($im, 0, 0, $w-1, $h-1, $c2); imagestring ($im, 2, 5, 5, "gif format", $c2); imagestring ($im, 2, 5, 15, "not", $c2); imagestring ($im, 2, 5, 25, "supported", $c2); header (www.php.net/header) ("content-type: image/png"); imagepng($im); return; } } elseif ($imT==2) { $im=imagecreatefromjpeg ($image); } elseif ($imT==3) { $im=imagecreatefrompng ($image); } imagecopyresized ($im2, $im, 0, 0, 0, 0, $imageWidth, $imageHeight, $imW, $imH); imagedestroy ($im);
$props=$imW . "x" . $imH . ", " . round (www.php.net/round)(filesize (www.php.net/filesize)("gfx$image")/1024) . "Kb"; //$c1=imagecolorallocate ($im2, 255, 255, 255); //$c2=imagecolorallocate ($im2, 0, 0, 0); $c1=imagecolorclosest ($im2, 255, 255, 255); $c2=imagecolorclosest ($im2, 0, 0, 0); $textWidth=strlen (www.php.net/strlen)($props)*5; $textHeight=9; ImageFilledRectangle ($im2, 0, 0, $textWidth, $textHeight, $c2); imagestring ($im2, 1, 1, 1, $props, $c1);
if ($imT==2) { imagejpeg ($im2); } else { imagepng ($im2); } ?> | способы вызова: Code (html): | скопировать код в буфер обмена | <img (december.com/html/4/element/img.html) src="thumbs.php?image=picture1.jpg&w=400" width="400px" alt="Картинка 1"> (december.com/html/4/element/.html) | изменит картинку до размеров ширины в 400 пикселов. Высота будет зависеть от высоты исходной картинки. с левом верхнем углу появляется прямоугольничек с информацией исходной фотографии (ширина, высота, размер Kb). Пользуйтесь, товарищи!
|
|
Back to top |
|
 |
Чебурген
Участник форума
Joined: 05 Sep 2004
Posts: 129
Карма: -36 поощрить/наказать
|
Posted: Mon Oct 25, 2004 6:00 pm (спустя 2 часа 12 минут; написано за 1 минуту 58 секунд)
Post subject:
|
|
У меня тоже была подобная глупость, и даже использовалась. До первого раза, пока не пришлось воспользоваться imageMagick-ом.
|
|
Back to top |
|
 |
Чебурген
Участник форума
Joined: 05 Sep 2004
Posts: 129
Карма: -36 поощрить/наказать
|
Posted: Mon Oct 25, 2004 6:01 pm (спустя 1 минуту 48 секунд; написано за 10 секунд)
Post subject:
|
|
deMone:
Ошибки интересуют?
|
|
Back to top |
|
 |
deMone - лень войти
Guest
Карма: 388 поощрить/наказать
|
Posted: Tue Oct 26, 2004 12:47 am (спустя 6 часов 45 минут; написано за 22 секунды)
Post subject:
|
|
Ошибки - естественно. А вот про глупость ты зря: мне ведь не нужно ничего особо важного или сложного. Так на кой чего-то городить? Проще быть надо P.S. Как-то войти лень.
|
|
Back to top |
|
 |
Годзилла
Guest
Карма: 388 поощрить/наказать
|
Posted: Tue Oct 26, 2004 9:56 am (спустя 9 часов 9 минут; написано за 2 минуты 56 секунд)
Post subject:
|
|
deMone - лень войти wrote: |
Так на кой чего-то городить? | Так о том и речь. Зачем городить, если с использованием imagemagick вся эта гора кода ужимается до одной строчки? deMone - лень войти wrote: |
Проще быть надо |
deMone - лень войти wrote: |
Ошибки - естественно. | Ну ты уж определись сначала. Хочешь быть проще - тогда забей на ошибки, как забил на информацию об imagemagick. Хочешь ошибки - проще не получится, тут думать придется.
|
|
Back to top |
|
 |
Ecler
Заглянувший
Joined: 05 Jan 2005
Posts: 3
Карма: -1 поощрить/наказать
|
Posted: Wed Jan 05, 2005 12:17 am (спустя 2 месяца 9 дней 14 часов 20 минут; написано за 8 секунд)
Post subject:
|
|
Вопрос: что делать с прозрачными gif при ресайзе, а то у меня фон становится черным?
|
|
Back to top |
|
 |
deMone
Участник форума

Joined: 03 May 2004
Posts: 90
Карма: 6 поощрить/наказать
Location: из России
|
Posted: Wed Jan 05, 2005 12:48 am (спустя 31 минуту; написано за 33 секунды)
Post subject:
|
|
сначала определи прозрачный цвет в исходном изображении, потом установи прозрачным цвет в конечном изображении.
|
|
Back to top |
|
 |
Ecler
Заглянувший
Joined: 05 Jan 2005
Posts: 3
Карма: -1 поощрить/наказать
|
Posted: Wed Jan 05, 2005 11:58 am (спустя 11 часов 9 минут; написано за 39 секунд)
Post subject:
|
|
Вот в том и проблема, что я не знаю как его определить в исходном изображении.
|
|
Back to top |
|
 |
Дмитрий Котеров
Администратор

Joined: 10 Mar 2003
Posts: 13665
Карма: 413 поощрить/наказать
|
Posted: Wed Jan 05, 2005 6:06 pm (спустя 6 часов 8 минут; написано за 21 секунду)
Post subject:
|
|
В смысле? А php.net/imagecolortransparent на что?
|
|
Back to top |
|
 |
Ecler
Заглянувший
Joined: 05 Jan 2005
Posts: 3
Карма: -1 поощрить/наказать
|
Posted: Wed Jan 05, 2005 7:20 pm (спустя 1 час 13 минут; написано за 52 секунды)
Post subject:
|
|
Это я знаю, но как узнать какой цвет в исходном gif-файле считается прозрачным?
|
|
Back to top |
|
 |
Дмитрий Котеров
Администратор

Joined: 10 Mar 2003
Posts: 13665
Карма: 413 поощрить/наказать
|
Posted: Wed Jan 05, 2005 10:11 pm (спустя 2 часа 51 минуту)
Post subject:
|
|
 М |
| Из документации: The identifier of the new (or current, if none is specified) transparent color is returned. Минус-карма вам. Перенесено из форума: Разное :: PHP. Перенесено в форум: Лень сходить в Поиск. |
|
|
Back to top |
|
 |
Ecler
Заглянувший
Joined: 05 Jan 2005
Posts: 3
Карма: -1 поощрить/наказать
|
Posted: Mon Jan 10, 2005 3:19 am (спустя 4 дня 5 часов 7 минут; написано за 2 минуты 21 секунду)
Post subject:
|
|
Спасибо большое за понимание, вот только поиском я всегда пользуюсь прежде чем задать вопрос. Проблема в том что идентификатор прозрачного цвета в исходном изображении возвращается всегда как 0.
|
|
Back to top |
|
 |
Дмитрий Котеров
Администратор

Joined: 10 Mar 2003
Posts: 13665
Карма: 413 поощрить/наказать
|
Posted: Mon Jan 10, 2005 5:06 am (спустя 1 час 46 минут; написано за 43 секунды)
Post subject:
|
|
Так, может, он и есть как раз такой? Получите RGB-компоненты этого цвета (см. документацию), и потом используйте их для установки прозрачного цвета в новой картинке.
|
|
Back to top |
|
 |
|