Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

ресайз картинок (tribesman)
Author Message
tribesman
Заглянувший



Joined: 18 Oct 2004
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 12:01 pm (написано за 29 секунд)
   Post subject: ресайз картинок
Reply with quote

порой тоже оч удобно пользоваться
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
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 197
   поощрить/наказать

Location: 007 495

PostPosted: Mon Oct 18, 2004 7:10 pm (спустя 7 часов 8 минут; написано за 42 секунды)
   Post subject:
Reply with quote

tribesman:
Можно ввести еще один аргумент типа «$useresampled», и использовать при значении true фукнцию imagecopyresampled вместо функции imagecopyresized - картинки получаются намного лучшего качества.
Back to top
View user's profile Send private message Send e-mail
Евгений Галашин
Модератор



Joined: 29 Dec 2003
Posts: 1861
Карма: 32
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 7:38 pm (спустя 27 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

tribesman:
Учтите, что некоторые версии GD умеют только читать, скажем, GIF, но не писать. У Вас же — если умеет читать, значит должно и писать, что не есть так.

Далее, я не очнь понимаю, зачем одну и ту же строчку:
Code (php): скопировать код в буфер обмена
imagecopyresized ($thumb, $image, 0, 0, 0, 0, ($destWidth+1), ($destHeight+1), $img[0], $img[1]);
писать три раза.

И ещё: о типе boolean и о логических выражениях вообще Вы слышали? Зачем делать $err!=1, да ещё три раза?
И switch не проще ли было использовать?
Back to top
View user's profile Send private message
Чебурген
Участник форума



Joined: 05 Sep 2004
Posts: 129
Карма: -36
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 7:42 pm (спустя 3 минуты; написано за 3 минуты 22 секунды)
   Post subject:
Reply with quote

Я бы сделал такое замечание.
Во всех приведенных программах очень много повторяющегося кода.
Их можно сократить в половину, а главное - в разы упростить внесение правок.

Я уж не говорю об элегантном вызове ImageCreateFrom* через $function(), но хотя бы imagecopyresized можно было написать один раз?
Back to top
View user's profile Send private message Send e-mail
tribesman
Заглянувший



Joined: 18 Oct 2004
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 8:42 pm (спустя 1 час 27 секунд; написано за 28 секунд)
   Post subject:
Reply with quote

Чебурген wrote:
Я бы сделал такое замечание.
Во всех приведенных программах очень много повторяющегося кода.
Их можно сократить в половину, а главное - в разы упростить внесение правок.

Я уж не говорю об элегантном вызове ImageCreateFrom* через $function(), но хотя бы imagecopyresized можно было написать один раз?
исправлюсь.
Back to top
View user's profile Send private message
tribesman
Заглянувший



Joined: 18 Oct 2004
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 9:46 pm (спустя 1 час 4 минуты; написано за 47 секунд)
   Post subject:
Reply with quote

немного исправил
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
View user's profile Send private message
Евгений Галашин
Модератор



Joined: 29 Dec 2003
Posts: 1861
Карма: 32
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 10:13 pm (спустя 27 минут; написано за 18 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
else copy (www.php.net/copy)($file, $newfile);
Code (php): скопировать код в буфер обмена
$file, $thumb, $destWidth, $destHeight, $width_img, $height_img)
Вы что, смеётесь??
Back to top
View user's profile Send private message
Чебурген
Участник форума



Joined: 05 Sep 2004
Posts: 129
Карма: -36
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 11:25 pm (спустя 1 час 11 минут; написано за 7 минут 58 секунд)
   Post subject:
Reply with quote

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
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Mon Oct 18, 2004 11:37 pm (спустя 12 минут)
   Post subject:
Reply with quote


М

Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Oct 19, 2004 10:40 am (спустя 11 часов 3 минуты; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

Имя функции можно занести в переменную, и потом вызывать:
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
View user's profile Send private message Send e-mail
deMone
Участник форума



Joined: 03 May 2004
Posts: 90
Карма: 6
   поощрить/наказать

Location: из России

PostPosted: Mon Oct 25, 2004 3:47 pm (спустя 6 дней 5 часов 6 минут; написано за 18 секунд)
   Post subject: Немного другой вариант
Reply with quote

А вот мой вариант. Сделан давно, используется часто. Пример использования: 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
View user's profile Send private message Send e-mail
Чебурген
Участник форума



Joined: 05 Sep 2004
Posts: 129
Карма: -36
   поощрить/наказать


PostPosted: Mon Oct 25, 2004 6:00 pm (спустя 2 часа 12 минут; написано за 1 минуту 58 секунд)
   Post subject:
Reply with quote

У меня тоже была подобная глупость, и даже использовалась.
До первого раза, пока не пришлось воспользоваться imageMagick-ом.
Back to top
View user's profile Send private message Send e-mail
Чебурген
Участник форума



Joined: 05 Sep 2004
Posts: 129
Карма: -36
   поощрить/наказать


PostPosted: Mon Oct 25, 2004 6:01 pm (спустя 1 минуту 48 секунд; написано за 10 секунд)
   Post subject:
Reply with quote

deMone:
Ошибки интересуют?
Back to top
View user's profile Send private message Send e-mail
deMone - лень войти
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Oct 26, 2004 12:47 am (спустя 6 часов 45 минут; написано за 22 секунды)
   Post subject:
Reply with quote

Ошибки - естественно.

А вот про глупость ты зря: мне ведь не нужно ничего особо важного или сложного. Так на кой чего-то городить?
Проще быть надо


P.S. Как-то войти лень.
Back to top
Годзилла
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Oct 26, 2004 9:56 am (спустя 9 часов 9 минут; написано за 2 минуты 56 секунд)
   Post subject:
Reply with quote

deMone - лень войти wrote:
Так на кой чего-то городить?
Так о том и речь. Зачем городить, если с использованием imagemagick вся эта гора кода ужимается до одной строчки?
deMone - лень войти wrote:
Проще быть надо
deMone - лень войти wrote:
Ошибки - естественно.
Ну ты уж определись сначала.
Хочешь быть проще - тогда забей на ошибки, как забил на информацию об imagemagick.
Хочешь ошибки - проще не получится, тут думать придется.
Back to top
Ecler
Заглянувший



Joined: 05 Jan 2005
Posts: 3
Карма: -1
   поощрить/наказать


PostPosted: Wed Jan 05, 2005 12:17 am (спустя 2 месяца 9 дней 14 часов 20 минут; написано за 8 секунд)
   Post subject:
Reply with quote

Вопрос: что делать с прозрачными gif при ресайзе, а то у меня фон становится черным?
Back to top
View user's profile Send private message
deMone
Участник форума



Joined: 03 May 2004
Posts: 90
Карма: 6
   поощрить/наказать

Location: из России

PostPosted: Wed Jan 05, 2005 12:48 am (спустя 31 минуту; написано за 33 секунды)
   Post subject:
Reply with quote

сначала определи прозрачный цвет в исходном изображении, потом установи прозрачным цвет в конечном изображении.
Back to top
View user's profile Send private message Send e-mail
Ecler
Заглянувший



Joined: 05 Jan 2005
Posts: 3
Карма: -1
   поощрить/наказать


PostPosted: Wed Jan 05, 2005 11:58 am (спустя 11 часов 9 минут; написано за 39 секунд)
   Post subject:
Reply with quote

Вот в том и проблема, что я не знаю как его определить в исходном изображении.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Jan 05, 2005 6:06 pm (спустя 6 часов 8 минут; написано за 21 секунду)
   Post subject:
Reply with quote

В смысле?
А php.net/imagecolortransparent на что?
Back to top
View user's profile Send private message Send e-mail
Ecler
Заглянувший



Joined: 05 Jan 2005
Posts: 3
Карма: -1
   поощрить/наказать


PostPosted: Wed Jan 05, 2005 7:20 pm (спустя 1 час 13 минут; написано за 52 секунды)
   Post subject:
Reply with quote

Это я знаю, но как узнать какой цвет в исходном gif-файле считается прозрачным?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Jan 05, 2005 10:11 pm (спустя 2 часа 51 минуту)
   Post subject:
Reply with quote


М

Из документации:
The identifier of the new (or current, if none is specified) transparent color is returned.

Минус-карма вам.

Перенесено из форума: Разное :: PHP.
Перенесено в форум: Лень сходить в Поиск.
Back to top
View user's profile Send private message Send e-mail
Ecler
Заглянувший



Joined: 05 Jan 2005
Posts: 3
Карма: -1
   поощрить/наказать


PostPosted: Mon Jan 10, 2005 3:19 am (спустя 4 дня 5 часов 7 минут; написано за 2 минуты 21 секунду)
   Post subject:
Reply with quote

Спасибо большое за понимание, вот только поиском я всегда пользуюсь прежде чем задать вопрос. Проблема в том что идентификатор прозрачного цвета в исходном изображении возвращается всегда как 0.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon Jan 10, 2005 5:06 am (спустя 1 час 46 минут; написано за 43 секунды)
   Post subject:
Reply with quote

Так, может, он и есть как раз такой?
Получите RGB-компоненты этого цвета (см. документацию), и потом используйте их для установки прозрачного цвета в новой картинке.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You cannot download files in this forum.
XML